XML Security - приглашаются желающие к тестированию и обсуждению API

Европа - быстрые серверы на дисках NVMe от $5 / Русский датацентр от 199руб

Тема в разделе "PHP & XML-технологии", создана пользователем Alexandre, 29 авг 2006.

  1. Alexandre

    Alexandre PHPПенсионер

    Сообщения:
    5.035
    Ваш город:
    Saint Petersburg, Russia
    Address:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    XML Security - приглашаются желающие к тестированию и обсуждению API

    Коллеги,

    желающие внести вклад в OpenSource и имеющие время приглашаются к тестированию beta версии расширения php_xmlsec

    Что это из себя представляет, можно подчерпнуть из презентации http://edocs.phpclub.net/xmlsec/frame.htm или одним файлом http://edocs.phpclub.net/xmlsec.ppt

    Сам модуль можно скачать http://edocs.phpclub.net/xmlsec/xmlsec.zip
    в директории examples - примеры использования.

    Инсталляция - предварительно необходимо установить библиотеку libxmlsec http://aleksey.com/xmlsec/
    переписываем директорию xmlsec в ext
    далее в директории xmlsec запускаем make
    В директории modules скомпилируется so модуль, который можно перенести где находятся все экстеншены и подцепить в php.ini. Лично я конфигурацию не трогаю и загружаю dl.

    Особенно приветствуются предложения по созданию API, как удобнее.
    Готов ответить на любые вопросы.

    -~{}~ 31.08.06 10:42:

    новые идеи по API выложены тут http://edocs.phpclub.net/xmlsec/index.htm

    если есть предложения - пишите в форум

    -~{}~ 12.09.06 11:36:

    I see the new view of the php_xmlsec API.
    I make the simplification of the API. I exclude the class Template and dive the class XmlSecDoc to two classes
    - XmlSecEncryptor()
    - XmlSecDSigner()

    The xmlsec template will generate by new method ( $doc->generateTemplate or $doc->prepare it is more of like ) or load extern template by method $doc->loadTemplate();

    If template will generate by "prepare" method, API will use the ini from constructor:

    $doc = new XmlSecEncryprot( array(
    'KeyName' => 'Alexandre',
    'KeyEncAlgorithm' = 'XMLSEC_OAEM',
    'TransformAlgorithm'= 'XMLSEC_c14n',
    ));

    So, You can load any template by $doc->loadTemplate() method;

    I think, that the "prepare" method may be private and we have the rule: if don't call the "TemplateLoad" method before call the "encrypt" method, we call the "prepere" method.
    The next example new API:
    PHP:
    // create Encryptor class
    $xmlSecIni = array( 
        
    'KeyName' => 'Alexandre',
        
    'KeyEncAlgorithm' 'XMLSEC_OAEM',
        
    'TransformAlgorithm''XMLSEC_c14n',
            );
    $doc = new XmlSecEncryptor($xmlSecIni);   

    // loading
    $doc->load$xml_string );  // or  $doc->loadTemplate($tpl) - is optional 

    // set Key - The XmlSecKey class from old API without change.
    $doc->setKey($key);

    if ( 
    $doc->encrypt)
      print 
    $doc->save();
    else
      print 
    XmlSec->getError();

    // Decryption:

    $doc = new XmlSecEncryptor();   
    $doc->setKey($key);
    if ( 
    $doc->decrypt)
      print 
    $doc->save();
    else
      print 
    XmlSec->getError();
    The the XmlDSigner class is analog hte XmlSecEncryptor class.

    -~{}~ 20.10.06 10:43:

    Внимание!

    Выложена новая версия библиотеки.

    Большое спасибо, тем кто принял в тестировании. Все замечания учтены.
     
  2. si

    si Administrator

    Сообщения:
    1.773
    Ваш город:
    Tallinn, Estonia
    Address:
    Tallinn, Estonia
    Country:
    Location on Map:
    [Mon Dec 3 12:21:36 2007] [notice] child pid 26647 exit signal Segmentation fault (11)


    PHP:
    <?php
    <?php

    $xmlStrFirst 
    '';

    $iniEnc = array(
        
    'id'=>'128',
        
    'KeyName' => 'Alexandre',
        
    'EncryptionMethod'=> XMLSEC_3DES,
        
    'EncryptedKeyAlgorithm' => XMLSEC_EN_RSA_1_5,
    );

    $key = new XMLSecKey();
    $key->loadFromFile('rsaprivkey.pem'XMLSEC_KEY_FORMAT_PEM);

    $enc = new XMLSecEncryptor($iniEnc);
    $enc->load$xmlStrFirst);
    $enc->setKey($key);
    $enc->encrypt();

    ?>
    версии софта такие

    xmlsec1-1.2.11-1
    xmlsec1-openssl-1.2.11-1
    apache 1.3.39
    php 5.2.5
    libxml2-2.6.20-4
    libxslt-1.1.14-3

    вторая проблема, если собрать php с этим ext при старте апача или php-cli получаем

    error : Unknown IO error
     
  3. Alexandre

    Alexandre PHPПенсионер

    Сообщения:
    5.035
    Ваш город:
    Saint Petersburg, Russia
    Address:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    Ось какая?
     
  4. si

    si Administrator

    Сообщения:
    1.773
    Ваш город:
    Tallinn, Estonia
    Address:
    Tallinn, Estonia
    Country:
    Location on Map:
    suse 10.0

    -~{}~ 03.12.07 13:30:

    с segmentation понятно это изза пустой $xmlStrFirst
     
  5. phpdev2007

    phpdev2007 Новичок

    Сообщения:
    121
    Address:
    Lviv, Ukraine
    Country:
    Location on Map:
    Alexandre
    Скажите пожалуйста, если я правильно понял, эта библиотека шифрует любой xml файл, тоесть шифрует тело документа xml?
    и возвращает в зашифрованном виде?
     
  6. tony2001

    tony2001 TeaM PHPClub

    Сообщения:
    9.257
    Address:
    Lviv, Ukraine
    Country:
    Location on Map:
    патч для сегфолта:
    http://dev.daylessday.org/diff/xmlsec_empty_string_segfault.diff

    хинт: та же проблема в XMLSecEncryptor::loadTemplate() (которая в proto почему-то называется setTemplate()), возможно в xmlseckey::load() и в других местах.

    Комментарии:
    экстеншен, который завязан на внешнюю либу, не может включаться --enable-ext.
    должна быть возможность указать где эта либа лежит, а у --enable-.. всего два значения - yes/no.
    (xmlreader, xmlwriter & simplexml используют --enable только потому, что есть отдельная опция --with-libxml-dir, одна на всех).

    плюс, если либа не найдена, то было бы неплохо об этом сообщать.
    поэтому следующий патч:
    http://dev.daylessday.org/diff/xmlsec_config.diff

    хорошо бы еще пофиксить варнинги:
    Код:
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function '_php_xmlsec_encryptor_prepare':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:572: warning: unused variable 'key_size'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:569: warning: unused variable 'xmlSecKeyData'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:568: warning: unused variable 'TransformId'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:563: warning: unused variable 'id'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:562: warning: unused variable 'zdata'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:561: warning: unused variable 'key_object'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_test':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:680: warning: unused variable 'pDoc'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_decrypt':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:871: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:877: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:883: warning: pointer targets in passing argument 2 of 'xmlGetProp' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:905: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:907: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:909: warning: pointer targets in passing argument 2 of 'xmlGetProp' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:972: warning: pointer targets in initialization differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_getKeyName':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1043: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1046: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecdsigner___construct':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1101: warning: unused variable 'TransformId'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecdsigner_verify':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1517: warning: unused variable 'docStr'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_startup_xmlsec':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1834: warning: unused variable 'err_rsc'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_shutdown_xmlsec':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2014: warning: implicit declaration of function 'xsltCleanupGlobals'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_info_xmlsec':
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2032: warning: implicit declaration of function 'php_info_print_table_start'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2033: warning: implicit declaration of function 'php_info_print_table_header'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2034: warning: implicit declaration of function 'php_info_print_table_row'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2057: warning: implicit declaration of function 'php_info_print_table_end'
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: At top level:
    /local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:46: warning: 'p_error' defined but not used
    
    и вообще код желательно почистить (начать можно с фолдинга, который на данный момент поломан).

    некоторые куски кода выглядят странно:
    1.XMLSecDSignner::verify()
    Код:
        intern = (xmlsec_dsigner_object *)zend_object_store_get_object(id TSRMLS_CC);
    
        if (intern->doc == NULL || intern->doc->document->ptr == NULL) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "The XML document is not valid");
            RETURN_FALSE;
        }
    
    2. XMLSecDSignner::test()
    Код:
        intern = (xmlsec_dsigner_object *)zend_object_store_get_object(id TSRMLS_CC);
    
        if (intern == NULL){
            php_error_docref(NULL TSRMLS_CC, E_WARNING,  "failed to get class");
            RETURN_FALSE;
        }
    
    т.е. теоретически допускается, что в object storage может оказаться NULL, но почему-то проверяется это только в одном месте.

    а вообще, по-хорошему, для каждой функции надо как минимум несколько тестов писать - подавать правильные параметры, неправильные параметры, edge cases и т.п.
     
  7. Alexandre

    Alexandre PHPПенсионер

    Сообщения:
    5.035
    Ваш город:
    Saint Petersburg, Russia
    Address:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    Yes
    More information (and link to XMLEcrypt specification ) You can to find at link php_xmlsec
    sitomorrow I download fixed version. This version is old.
    PS. sorry for english, I d'nt have russian fonts.
     
  8. phpdev2007

    phpdev2007 Новичок

    Сообщения:
    121
    Address:
    Lviv, Ukraine
    Country:
    Location on Map:
    Alexandre
    понятно, спасибо за ответ, я прочитал всю презентацию,
    но все равно не смог найти ответ, почему нельзя просто шифровать xml при передачи, средствами php - Mcrypt? в чем преимущество библиотеки, если можно конечно ответьте пожалуйста,
    p/s
    я не говорю что она не нужна, я просто хочу понять ее преимущества.
     
  9. si

    si Administrator

    Сообщения:
    1.773
    Ваш город:
    Tallinn, Estonia
    Address:
    Tallinn, Estonia
    Country:
    Location on Map:
    еще вопрос.

    сама либа xmlsec (если использовтаь cli или php_sec) работает как-то странно.

    если она использует дефолтный openssl конфиг, то она ищет в /etc/ssl файл cert.pem которого нету, как результат

    Код:
    #>xmlsec1 sign --privkey-pem dsaprivkey.pem,dsacert.pem --pubkey-cert-pem dsacert.pem --output out.xml 1.xml
    error : Unknown IO error
    func=xmlSecOpenSSLX509StoreInitialize:file=x509vfy.c:line=651:obj=x509-store:subj=X509_LOOKUP_add_dir:error=4:crypto library function failed: 
    func=xmlSecKeyDataStoreCreate:file=keysdata.c:line=1328:obj=x509-store:subj=id->initialize:error=1:xmlsec library function failed: 
    func=xmlSecOpenSSLKeysMngrInit:file=crypto.c:line=313:obj=unknown:subj=xmlSecKeyDataStoreCreate:error=1:xmlsec library function failed:xmlSecOpenSSLX509StoreId
    func=xmlSecOpenSSLAppDefaultKeysMngrInit:file=app.c:line=1270:obj=unknown:subj=xmlSecOpenSSLKeysMngrInit:error=1:xmlsec library function failed: 
    Error: failed to initialize keys manager.
    
    сейчас как workaround использую --crypto-config /dev/null но хотелось бы понять как правильно конфигурить этот xmlsec (или openssl для него).
     
  10. Alexandre

    Alexandre PHPПенсионер

    Сообщения:
    5.035
    Ваш город:
    Saint Petersburg, Russia
    Address:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    можно шифровать средствами mcrypt, но тогда получится просто бинарное шифрование. Сам стандарт W3C XMLEncrypt предполагает как шифрование всего документа, так и его части. И еще в протоколе продуманы разные мелочи, о которых приходится заботиться, если делаешь что-то используя стандартные методы, например приаттачивание сертификатов, хешей, шифрованных ключей и пр...

    Как показывает практика, сам стандарт, в чистом виде, используется редко, но данный стандарт (рекомендация) используются в других стандартах, например cXML, WS-Security (защита SOAP), SAML etc... которые нашли широкое практическое применение в области защиты информации.

    -~{}~ 04.12.07 00:16:

    действительно странно, попробуй так
    xmlsec1 sign --privkey-pem dsaprivkey.pem --pubkey-cert-pem dsacert.pem --output out.xml 1.xml
    попробуй написать полные пути до dsaprivkey.pem и dsacert.pem
    выложи 1.xml

    -~{}~ 04.12.07 00:20:

    согл. постараюсь выложить завтра новую версию. У меня на каждый метод - по тесту.

    -~{}~ 04.12.07 02:30:

    fixed...

    sorry, ftp forbiden
    Попросил Сашу, чтоб открыл
     
  11. si

    si Administrator

    Сообщения:
    1.773
    Ваш город:
    Tallinn, Estonia
    Address:
    Tallinn, Estonia
    Country:
    Location on Map:
    когда можно ожидать новую версию ?
     
  12. Alexandre

    Alexandre PHPПенсионер

    Сообщения:
    5.035
    Ваш город:
    Saint Petersburg, Russia
    Address:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    si, сообщи и я вышлю на мыло,
    Саша что-то пока не открывает доступ... У меня на работе идет апгрейт софта... ася пока не установлена и я не имею с ним связи.