JFIF$        dd7 

Viewing File: /usr/lib/python3.9/site-packages/certbot/__pycache__/ocsp.cpython-39.opt-1.pyc

a

}|�ge<�@s�dZddlmZddlmZddlZddlZddlZddlmZddlmZddlm	Z	ddl
Z
ddlmZdd	l
mZdd
l
mZddlmZddlmZdd
lmZddlmZddlZddlZddlmZddlmZddlmZddlmZddlm Z e�!e"�Z#Gdd�d�Z$e%e	ee%ee%fd�dd�Z&e%e%e%e'e(d�dd�Z)ddej*e%dd�dd �Z+dej*e%dd!�d"d#�Z,e%e%e%e(d$�d%d&�Z-dS)'z*Tools for checking certificate revocation.�)�datetime)�	timedeltaN)�PIPE)�Optional)�Tuple)�x509)�InvalidSignature)�UnsupportedAlgorithm)�default_backend)�hashes)�
serialization)�ocsp)�crypto_util)�errors)�util)�getenv)�
RenewableCertc@s`eZdZdZdedd�dd�Zeed�dd	�Zdeee	ed�dd
�Z
eeeee	ed�dd�ZdS)�RevocationCheckerzEThis class figures out OCSP checking on this system, and performs it.FN)�enforce_openssl_binary_usage�returncCsrd|_||_|jrnt�d�s0t�d�d|_dStjgd�ttddt�	�d�}d|j
vrddd	�|_n
d
d	�|_dS)NF�opensslz-openssl not installed, can't check revocationT)rr
�-header�var�val)�stdout�stderrZuniversal_newlines�check�envz	Missing =cSs
d|gS)NzHost=���hostrr�0/usr/lib/python3.9/site-packages/certbot/ocsp.py�<lambda>1�z,RevocationChecker.__init__.<locals>.<lambda>cSsd|gS)NZHostrrrrr!r"3r#)�broken�use_openssl_binaryrZ
exe_exists�logger�info�
subprocess�runrZenv_no_snap_for_external_callsr�	host_args)�selfrZtest_host_formatrrr!�__init__"s


�
zRevocationChecker.__init__��certrcCs|�|j|j�S)a Get revoked status for a particular cert version.

        .. todo:: Make this a non-blocking call

        :param `.interfaces.RenewableCert` cert: Certificate object
        :returns: True if revoked; False if valid or the check failed or cert is expired.
        :rtype: bool

        )�ocsp_revoked_by_paths�	cert_path�
chain_path)r+r.rrr!�ocsp_revoked5s
zRevocationChecker.ocsp_revoked�
)r0r1�timeoutrcCsf|jr
dSt�tj�}t�|�|kr(dSt|�\}}|r<|s@dS|jrX|�	|||||�St
||||�S)aEPerforms the OCSP revocation check

        :param str cert_path: Certificate filepath
        :param str chain_path: Certificate chain
        :param int timeout: Timeout (in seconds) for the OCSP query

        :returns: True if revoked; False if valid or the check failed or cert is expired.
        :rtype: bool

        F)r$r�now�pytz�UTCrZnotAfter�_determine_ocsp_serverr%�_check_ocsp_openssl_bin�_check_ocsp_cryptography)r+r0r1r4r5�urlr rrr!r/Asz'RevocationChecker.ocsp_revoked_by_paths)r0r1r r;r4rc
Cstd�}td�}d}|dus$|dur4|dur0|n|}|durFd|g}	n&|�d�r`|td�d�}d|d|g}	ddd	d
|d|d|d
|ddt|�dg|�|�|	}
t�d|�t�d�|
��ztj	|
tjd�\}}Wn"t
jy�t�d|�YdS0t
|||�S)NZ
http_proxyZ
HTTP_PROXYz-urlzhttp://z-hostz-pathrr
z	-no_noncez-issuerz-certz-CAfilez
-verify_otherz-trust_otherz-timeoutrzQuerying OCSP for %s� )�log�*OCSP check failed for %s (are we offline?)F)r�
startswith�len�strr*r&�debug�joinrZ
run_scriptrZSubprocessErrorr'�_translate_ocsp_query)
r+r0r1r r;r4Zenv_http_proxyZenv_HTTP_PROXYZ
proxy_hostZurl_opts�cmd�output�errrrr!r9^s@

���	z)RevocationChecker._check_ocsp_openssl_bin)F)r3)�__name__�
__module__�__qualname__�__doc__�boolr,rr2rA�intr/r9rrrr!rs�r)r0rc	s�t|d��"}t�|��t��}Wd�n1s20Yz:|j�tj�}tjj	��fdd�|j
D�}|djj
}Wn&tjt
fy�t�d|�YdS0|��}|�d�d	�d
�}|r�||fSt�d||�dS)z�Extract the OCSP server host from a certificate.

    :param str cert_path: Path to the cert we're checking OCSP for
    :rtype tuple:
    :returns: (OCSP server URL or None, OCSP server host or None)

    �rbNcsg|]}|j�kr|�qSr)Z
access_method)�.0�description�Zocsp_oidrr!�
<listcomp>�s
�z*_determine_ocsp_server.<locals>.<listcomp>rzCannot extract OCSP URI from %s)NNz://��/z;Cannot process OCSP host from URL (%s) in certificate at %s)�openr�load_pem_x509_certificate�readr
�
extensions�get_extension_for_classZAuthorityInformationAccessZAuthorityInformationAccessOIDZOCSP�valueZaccess_location�ExtensionNotFound�
IndexErrorr&r'�rstrip�	partition)r0�file_handlerr.�	extensionZdescriptionsr;r rrQr!r8�s 0r8)r0r1r;r4rc
Cs.t|d��"}t�|��t��}Wd�n1s20Yt|d��"}t�|��t��}Wd�n1sn0Yt��}|�||t�	��}|�
�}|�tj
j�}	ztj||	ddi|d�}
Wn(tjjy�tjd|dd�YdS0|
jd	k�rt�d
||
j�dSt�|
j�}|jtjjk�r<t�d||j�dSzt||||�Wn�t�y�}zt�t|��WYd}~n�d}~0tj �y�}zt�t|��WYd}~n|d}~0t!�y�t�d|�YnVt"�y
}
zt�d
|t|
��WYd}
~
n(d}
~
00t�#d||j$�|j$tj%j&kSdS)NrNzContent-Typezapplication/ocsp-request)�dataZheadersr4r>T)�exc_infoF��z*OCSP check failed for %s (HTTP status: %d)z'Invalid OCSP response status for %s: %sz)Invalid signature on OCSP response for %sz!Invalid OCSP response for %s: %s.z%OCSP certificate status for %s is: %s)'rUrrVrWr
r
ZOCSPRequestBuilderZadd_certificaterZSHA1ZbuildZpublic_bytesrZEncodingZDER�requestsZpost�
exceptionsZRequestExceptionr&r'Zstatus_codeZload_der_ocsp_responseZcontentZresponse_statusZOCSPResponseStatusZ
SUCCESSFUL�warning�_check_ocsp_responser	rAr�Errorr�AssertionErrorrBZcertificate_statusZOCSPCertStatusZREVOKED)r0r1r;r4r_�issuerr.ZbuilderZrequestZrequest_binaryZresponse�
response_ocsp�e�errorrrr!r:�sP00�
�""(�r:zocsp.OCSPResponsezocsp.OCSPRequest)rk�request_ocsp�issuer_certr0rcCs�|j|jkrtd��t|||�t|jt|j��rJ|j|jksJ|j|jkrRtd��t�	t
j�jdd�}t
���jt
jddd�|js�td��|j|td	d
�kr�td��|jr�|j|td	d
�kr�td��Wd�n1s�0YdS)
z2Verify that the OCSP is valid for several criteriazMthe certificate in response does not correspond to the certificate in requestz<the issuer does not correspond to issuer of the certificate.N)Ztzinfo�ignorez'Properties that return.*datetime object)�messagezparam thisUpdate is not set.�)Zminutesz"param thisUpdate is in the future.z param nextUpdate is in the past.)Z
serial_numberri�_check_ocsp_response_signature�
isinstanceZhash_algorithm�typeZissuer_key_hashZissuer_name_hashrr5r6r7�replace�warnings�catch_warnings�filterwarningsZthis_updaterZnext_update)rkrnror0r5rrr!rg�s$
�
�
rg)rkror0rc		s"tjtd�dd���j|jks,�j�|�kr>t�d|�|}n�t�d|���fdd��jD�}|slt	d��|d	}|j
|jkr�t	d
��z"|j�tj
�}tjjj|jv}Wntjtfy�d}Yn0|s�t	d��|j}t�|��|j|j|��j}|�st	d
��t�|���j�j|�dS)zIVerify an OCSP response signature against certificate issuer or responderr-cSstj�|���jS)N)rZSubjectKeyIdentifierZfrom_public_key�
public_keyZdigest)r.rrr!�	_key_hash�sz1_check_ocsp_response_signature.<locals>._key_hashzGOCSP response for certificate %s is signed by the certificate's issuer.zGOCSP response for certificate %s is delegated to an external responder.cs*g|]"}�j|jks"�j�|�kr|�qSr)�responder_name�subject�responder_key_hash)rOr.�r{rkrr!rR
s�z2_check_ocsp_response_signature.<locals>.<listcomp>z0no matching responder certificate could be foundrz?responder certificate is not signed by the certificate's issuerFz<responder is not authorized by issuer to sign OCSP responsesz#no signature hash algorithm definedN)r�Certificate�bytesr|r}r~r&rBZcertificatesrirjrXrYZExtendedKeyUsageZoidZExtendedKeyUsageOIDZOCSP_SIGNINGrZr[r\Zsignature_hash_algorithmrZverify_signed_payloadrzZ	signatureZtbs_certificate_bytesZtbs_response_bytes)	rkror0Zresponder_certZresponder_certsr`Zdelegate_authorizedZchosen_cert_hashZchosen_response_hashrrr!rs�sD���
��rs)r0�ocsp_output�ocsp_errorsrc	s�d}�fdd�|D�}�fdd�|D�\}}}|r<|�d�nd}d|vsT|rP|sT|rrt�d	��t�d
�|�dS|r~|s~dS|r�|�d�}|r�t�d|�d
St�d�|�dSdS)z7Parse openssl's weird output to work out what it means.)�good�revoked�unknowncsg|]}d��|��qS)z{0}: (WARNING.*)?{1})�format)rO�s)r0rr!rR:r#z)_translate_ocsp_query.<locals>.<listcomp>c3s |]}tj|�tjd�VqdS))�flagsN)�re�search�DOTALL)rO�p)r�rr!�	<genexpr>;r#z(_translate_ocsp_query.<locals>.<genexpr>�NzResponse verify OKz#Revocation status for %s is unknownzUncertain output:
%s
stderr:
%sFzOCSP revocation warning: %sTz2Unable to properly parse OCSP output: %s
stderr:%s)�groupr&r'rBrf)	r0r�r�Zstates�patternsr�r�r�rfr)r0r�r!rD6s&
�rD).rKrrZloggingr�r(r�typingrrrwZcryptographyrZcryptography.exceptionsrr	Zcryptography.hazmat.backendsr
Zcryptography.hazmat.primitivesrrZcryptography.x509r
r6rdZcertbotrrrZcertbot.compat.osrZcertbot.interfacesrZ	getLoggerrHr&rrAr8rMrLr:r�rgrsrDrrrr!�<module>sD
e 1�)�:
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg