2013-03-22 2 views
1

GOST 암호화 인증서와 개인 키 쌍을 사용하여 PHP로 S/MIME에 서명하려고합니다.php, openssl 및 GOST

콘솔 모두에서의 openssl 자체를 사용 괜찮 :

/usr/local/openssl/bin/openssl cms -sign -in file.txt -out signedfile.txt -signer p12.pem 
(signedfile.txt is created) 

/usr/local/openssl/bin/openssl cms -verify -in signedfile.txt -out signedddata.txt -no_signer_cert_verify -issuer_checks -ignore_critical 
Verification successful 

내가 좀 붙어있어 PHP 코드를 사용하여 :

$res = openssl_pkcs7_sign("file.txt", "phpsignedfile.txt", 'file://'.realpath('./p12.pem'), 'file://'.realpath('./p12.pem'), array("To" => "[email protected]", "From: FooBar <[email protected]>", "Subject" => "Foo Bar")); 

    if (!$res) { 
     while ($msg = openssl_error_string()) 
      echo $msg . "<br />\n"; 
     echo "Failed to sign.\n"; exit; 
    } 

내가 얻을 :

# /usr/local/php/bin/php sign-clear.php 
PHP Warning: openssl_pkcs7_sign(): error getting private key in /root/tests/sign-clear.php on line 3 
error:0609E09C:digital envelope routines:PKEY_SET_TYPE:unsupported algorithm<br /> 
error:0606F076:digital envelope routines:EVP_PKCS82PKEY:unsupported private key algorithm<br /> 
error:0907B00D:PEM routines:PEM_READ_BIO_PRIVATEKEY:ASN1 lib<br /> 
Failed to sign. 

을 '개인 키를 가져 오는 중 오류가 발생했습니다'라는 메시지가 항상 여기에 있습니다. 실제로로드 할 수없는 경우를 제외하고는 '시작 줄 오류 없음'이 표시됩니다. 그래서이 출력은 PHP openssl 모듈이 적절한 암호를 찾을 수없는 것처럼 보입니다.

PHP에게 GOST 암호임을 어떻게 알리시겠습니까? 나는 이것을 openssl에게 설정 파일을 사용하거나 직접 '-engine gost'옵션을 사용하여 알려줍니다. PHP에게 똑같은 것을 말할 수있는 방법이 있습니까?

나는 참이 (OpenSSL이 모듈은 함께 PHP로 만들어진)는 GOST-활성화 openss의 1.0.1e로 컴파일 및 링크 된 PHP :

# /usr/local/openssl/bin/openssl ciphers | grep -i GOST 
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES128-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5 

(는 기본 설정 출력의 통지)

# ldd /usr/local/php/bin/php 
     linux-vdso.so.1 => (0x00007fff42455000) 
     libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007f1077404000) 
     libresolv.so.2 => /lib/libresolv.so.2 (0x00007f10771ee000) 
     librt.so.1 => /lib/librt.so.1 (0x00007f1076fe5000) 
     libmcrypt.so.4 => /usr/lib/libmcrypt.so.4 (0x00007f1076db3000) 
     libltdl.so.7 => /usr/lib/libltdl.so.7 (0x00007f1076baa000) 
     libdl.so.2 => /lib/libdl.so.2 (0x00007f10769a5000) 
     libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f107671d000) 
     libz.so.1 => /usr/lib/libz.so.1 (0x00007f1076506000) 
     libpng12.so.0 => /lib/libpng12.so.0 (0x00007f10762df000) 
     libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x00007f10760bc000) 
     libcrypto.so.1.0.0 => /usr/local/openssl/lib/libcrypto.so.1.0.0 (0x00007f1075ce2000) 
     libssl.so.1.0.0 => /usr/local/openssl/lib/libssl.so.1.0.0 (0x00007f1075a78000) 
     libmysqlclient.so.16 => /usr/lib/libmysqlclient.so.16 (0x00007f107565b000) 
     libpthread.so.0 => /lib/libpthread.so.0 (0x00007f107543f000) 
     libnsl.so.1 => /lib/libnsl.so.1 (0x00007f1075226000) 
     libm.so.6 => /lib/libm.so.6 (0x00007f1074fa4000) 
     libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f1074c53000) 
     libc.so.6 => /lib/libc.so.6 (0x00007f10748f0000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007f1077646000) 

답변

1

실제로 버그 보고서가 있습니다. 모두 ext/openssl/openssl.c에 패치를 적용해야합니다.

SSL_library_init(); 
OpenSSL_add_all_ciphers(); 
OpenSSL_add_all_digests(); 

전화 세트 전에

OPENSSL_config(NULL); 

를 추가. 그런 다음 openssl은 OPENSSL_CONF 변수를 가진 config에서 엔진을 사용하여 작업을 시작합니다.