def create_tra(service=SERVICE, ttl=2400): "Crear un Ticket de Requerimiento de Acceso (TRA)" tra = SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>' '<loginTicketRequest version="1.0">' "</loginTicketRequest>") tra.add_child("header") # El source es opcional. Si falta, toma la firma (recomendado). # tra.header.addChild('source','subject=...') # tra.header.addChild('destination','cn=wsaahomo,o=afip,c=ar,serialNumber=CUIT 33693450239') tra.header.add_child("uniqueId", str(date("U"))) tra.header.add_child("generationTime", str(date("c", date("U") - ttl))) tra.header.add_child("expirationTime", str(date("c", date("U") + ttl))) tra.add_child("service", service) return tra.as_xml()
def create_tra(service=SERVICE,ttl=2400): "Crear un Ticket de Requerimiento de Acceso (TRA)" tra = SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?>' '<loginTicketRequest version="1.0">' '</loginTicketRequest>') tra.add_child('header') # El source es opcional. Si falta, toma la firma (recomendado). #tra.header.addChild('source','subject=...') #tra.header.addChild('destination','cn=wsaahomo,o=afip,c=ar,serialNumber=CUIT 33693450239') tra.header.add_child('uniqueId',str(date('U'))) tra.header.add_child('generationTime',str(date('c',date('U')-ttl))) tra.header.add_child('expirationTime',str(date('c',date('U')+ttl))) tra.add_child('service',service) return tra.as_xml()
def create_tra(service=None, ttl=2400, cert=None): "Create a Access Request Ticket (TRA)" # Base TRA squeleton (Ticket de Requerimiento de Acceso) tra = SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>' '<loginTicketRequest version="1.0">' '</loginTicketRequest>') tra.add_child('header') # get the source from the certificate subject, ie "CN=empresa, O=dna, C=py" if cert: crt = xmlsec.x509_parse_cert(cert) tra.header.add_child('source', crt.get_subject().as_text()) tra.header.add_child('destination', 'C=py, O=dna, OU=sofia, CN=wsaatest') d = int(time.mktime(datetime.datetime.now().timetuple())) tra.header.add_child('uniqueId', str(d)) date = lambda ts: datetime.datetime.fromtimestamp(ts).isoformat() tra.header.add_child('generationTime', str(date(d - ttl))) tra.header.add_child('expirationTime', str(date(d + ttl))) tra.add_child('service', service) return tra.as_xml()
def create_tra(service=None, ttl=2400, cert=None): "Create a Access Request Ticket (TRA)" # Base TRA squeleton (Ticket de Requerimiento de Acceso) tra = SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?>' '<loginTicketRequest version="1.0">' '</loginTicketRequest>') tra.add_child('header') # get the source from the certificate subject, ie "CN=empresa, O=dna, C=py" if cert: crt = xmlsec.x509_parse_cert(cert) tra.header.add_child('source', crt.get_subject().as_text()) tra.header.add_child('destination', 'C=py, O=dna, OU=sofia, CN=wsaatest') d = int(time.mktime(datetime.datetime.now().timetuple())) tra.header.add_child('uniqueId', str(d)) date = lambda ts: datetime.datetime.fromtimestamp(ts).isoformat() tra.header.add_child('generationTime', str(date(d-ttl))) tra.header.add_child('expirationTime', str(date(d+ttl))) tra.add_child('service', service) return tra.as_xml()
# leer el certificado (PEM) del emisor y agregarlo cert_lines = open("certificado.crt").readlines() cert_pem = ''.join([line for line in cert_lines if not line.startswith("---")]) setattr(caratula, "DGICFE:X509Certificate", cert_pem) # preparar la plantilla para la info de firma con los namespaces padres (CFE) plantilla = SimpleXMLElement(xmlsec.SIGN_ENV_TMPL) plantilla["xmlns:DGICFE"] = plantilla["xmlns:ns0"] = "http://cfe.dgi.gub.uy" plantilla["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance" #plantilla["xsi:schemaLocation"] = "http://cfe.dgi.gub.uy EnvioCFE_v1.11.xsd" # firmar el CFE, reemplazar valores en la plantilla y agregar la firma al CFE # NOTA: para verificar la firma usar la plantilla RSA para KeyInfo (comentado) vars = xmlsec.rsa_sign(cfe.as_xml(), '', "private.key", "password", sign_template=plantilla.as_xml(), c14n_exc=False, cert="".join(cert_lines), key_info_template=xmlsec.KEY_INFO_X509_TMPL, #key_info_template=xmlsec.KEY_INFO_RSA_TMPL, ) firma_xml = (xmlsec.SIGNATURE_TMPL % vars) cfe("ns0:CFE").import_node(SimpleXMLElement(firma_xml)) # guardo el xml firmado para depuración open("test.xml", "w").write(cfe.as_xml()) print cfe.as_xml() # serializar CDATA según el ejemplo cdata = xml.dom.minidom.CDATASection() cdata.data = cfe.as_xml()
# leer el certificado (PEM) del emisor y agregarlo cert_lines = open("certificado.crt").readlines() cert_fmt = [line for line in cert_lines if not line.startswith("---")] cert_pem = ''.join(cert_fmt) setattr(caratula, "DGICFE:X509Certificate", cert_pem) cfeXML = cfe("ns0:CFE") # preparar la plantilla para la info de firma con los namespaces padres (CFE) plantilla = SimpleXMLElement(xmlsec.SIGN_ENV_TMPL) plantilla["xmlns:DGICFE"] = plantilla["xmlns:ns0"] = "http://cfe.dgi.gub.uy" vars = xmlsec.rsa_sign(cfeXML.write_c14n(), '', "private.key", 'la passphrase', sign_template=plantilla.as_xml(), c14n_exc=False, cert=''.join(cert_lines), key_info_template=xmlsec.KEY_INFO_X509_TMPL, #key_info_template=xmlsec.KEY_INFO_RSA_TMPL, ) firma_xml = (xmlsec.SIGNATURE_TMPL % vars) cfeXML.import_node(SimpleXMLElement(firma_xml)) # guardo el xml firmado para depuración open("cfe_firmado.xml", "w").write(cfe.as_xml()) # serializar CDATA según el ejemplo cdata = xml.dom.minidom.CDATASection() cdata.data = cfeXML.as_xml()
# leer el certificado (PEM) del emisor y agregarlo cert_lines = open("certificado.crt").readlines() cert_pem = ''.join([line for line in cert_lines if not line.startswith("---")]) setattr(caratula, "DGICFE:X509Certificate", cert_pem) # preparar la plantilla para la info de firma con los namespaces padres (CFE) plantilla = SimpleXMLElement(xmlsec.SIGN_ENV_TMPL) plantilla["xmlns:DGICFE"] = plantilla["xmlns:ns0"] = "http://cfe.dgi.gub.uy" plantilla["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance" #plantilla["xsi:schemaLocation"] = "http://cfe.dgi.gub.uy EnvioCFE_v1.11.xsd" # firmar el CFE, reemplazar valores en la plantilla y agregar la firma al CFE # NOTA: para verificar la firma usar la plantilla RSA para KeyInfo (comentado) vars = xmlsec.rsa_sign( cfe.as_xml(), '', "private.key", "password", sign_template=plantilla.as_xml(), c14n_exc=False, cert="".join(cert_lines), key_info_template=xmlsec.KEY_INFO_X509_TMPL, #key_info_template=xmlsec.KEY_INFO_RSA_TMPL, ) firma_xml = (xmlsec.SIGNATURE_TMPL % vars) cfe("ns0:CFE").import_node(SimpleXMLElement(firma_xml)) # guardo el xml firmado para depuración open("test.xml", "w").write(cfe.as_xml()) print cfe.as_xml()