U
    @†6^  ã                   @   s<   d dl Z d dlmZ d dlmZmZmZ G dd„ deƒZdS )é    N)Úurlparse)Ú
SpiderFootÚSpiderFootPluginÚSpiderFootEventc                   @   sV   e Zd ZdZdddddœZdddd	dœZd
Zeƒ fdd„Zdd„ Z	dd„ Z
dd„ Zd
S )Úsfp_sslcertz‰SSL Certificates:Footprint,Investigate:Crawling and Scanning::Gather information about SSL certificates used by the target's HTTPS sites.Té
   é   )ÚtryhttpÚverifyÚ
ssltimeoutÚcertexpiringdaysz6Also try to HTTPS-connect to HTTP sites and hostnames.z5Verify certificate subject alternative names resolve.z1Seconds before giving up trying to HTTPS connect.zNNumber of days in the future a certificate expires to consider it as expiring.Nc                 C   s4   || _ |  ¡ | _t| ¡ ƒD ]}|| | j|< qd S )N)ÚsfÚtempStorageÚresultsÚlistÚkeysÚopts)ÚselfÚsfcÚuserOptsÚopt© r   ú6/var/www/spiderfoot.crq.systems/modules/sfp_sslcert.pyÚsetup*   s    
zsfp_sslcert.setupc                 C   s
   dddgS )NÚINTERNET_NAMEÚLINKED_URL_INTERNALÚ
IP_ADDRESSr   ©r   r   r   r   ÚwatchedEvents6   s    zsfp_sslcert.watchedEventsc                 C   s   ddddddddd	d
dddgS )NÚTCP_PORT_OPENr   ÚINTERNET_NAME_UNRESOLVEDÚAFFILIATE_INTERNET_NAMEÚ"AFFILIATE_INTERNET_NAME_UNRESOLVEDÚSSL_CERTIFICATE_ISSUEDÚSSL_CERTIFICATE_ISSUERÚSSL_CERTIFICATE_MISMATCHÚSSL_CERTIFICATE_EXPIREDÚSSL_CERTIFICATE_EXPIRINGÚSSL_CERTIFICATE_RAWÚDOMAIN_NAMEÚAFFILIATE_DOMAIN_NAMEr   r   r   r   r   ÚproducedEvents<   s         ûzsfp_sslcert.producedEventsc              
   C   sä  |j }|j}|j}| j d| d | ¡ |dkr¶| ¡  d¡sN| jd sNd S z,t|ƒ}d}|j	rh|j	}| j 
| ¡ ¡}W q¾ tk
r² } z| j d| ¡ W Y ¢d S d }~X Y q¾X n|}d}|| jkrÔd| j|< nd S | j d	| d
 t|ƒ ¡ zR| j ||| jd ¡}	|	 ¡  |	 d¡}
| j |
¡}| j t|ƒ|| jd ¡}W nJ tk
r } z*| j d| d t|ƒ d ¡ W Y ¢d S d }~X Y nX |dkrÂtd|d
 t|ƒ | j|ƒ}|  |¡ | d¡sâ| j d| ¡ d S td|d | j|ƒ}|  |¡ | d¡r*td|d | j|ƒ}|  |¡ | d¡rTtd|d | j|ƒ}|  |¡ |dkr| d¡rtdd | d¡¡| j|ƒ}|  |¡ t| dtƒ ¡ƒD ]Ø}| dd ¡}|  ¡ j|dd!rÌd"}nd#}| jd$ r| j |¡s| j d%| d& ¡ |d'7 }t||| j|ƒ}|  |¡ | j || jd( ¡r¢| d)¡r^td*|| j|ƒ}|  |¡ ntd+|| j|ƒ}|  |¡ q¢| d,¡r®td-| d.d/¡| j|ƒ}|  |¡ d S | d0¡ràtd1| d.d/¡| j|ƒ}|  |¡ d S d S )2NzReceived event, z, from r   zhttps://r	   i»  zCouldn't parse URL: TzTesting SSL for: ú:r   r   zUnable to SSL-connect to z (ú))r   r   r   Útextz!Failed to parse the SSL cert for r(   Úissuedr#   Úissuerr$   r   Úmismatchr%   z, ÚhostsÚaltnamesz*.Ú )ÚincludeChildrenr   r!   r
   zHost z could not be resolvedÚ_UNRESOLVEDÚ_internettldsÚ	AFFILIATEr*   r)   Úexpiredr&   Ú	expirystrÚUnknownÚexpiringr'   ) Ú	eventTypeÚmoduleÚdatar   ÚdebugÚlowerÚ
startswithr   r   ÚportÚurlFQDNÚBaseExceptionr   ÚstrÚsafeSSLSocketÚdo_handshakeÚgetpeercertÚsslDerToPemÚ	parseCertÚinfor   Ú__name__ÚnotifyListenersÚgetÚjoinÚsetr   ÚreplaceÚ	getTargetÚmatchesÚresolveHostÚisDomain)r   ÚeventÚ	eventNameÚsrcModuleNameÚ	eventDataÚurC   ÚfqdnÚeÚsockÚdercertZpemcertÚcertÚxÚevtÚrawevtÚsanÚdomainÚevt_typer   r   r   ÚhandleEventE   s    

 








zsfp_sslcert.handleEvent)rM   Ú
__module__Ú__qualname__Ú__doc__r   Úoptdescsr   Údictr   r   r+   rg   r   r   r   r   r      s    ü	ü
	r   )ÚtimeÚurllib.parser   Úsflibr   r   r   r   r   r   r   r   Ú<module>   s   