2016-07-04 4 views
0

PHP 인터페이스로 인증 기관을 실행하고 싶습니다. 백엔드로서 phpseclib를 사용하고 싶습니다. (버전 1.0.2 - https://sourceforge.net/projects/phpseclib/files/phpseclib1.0.2.zip/download)phpseclib를 사용하여 발급자 정보 (CA)를 사용자 인증서로 설정하는 방법?

CA 루트 인증서는 openssl을 통해 생성되며 다음 스크립트는 내 CA에서 발급 한 유효한 클라이언트 인증서를 만들어야합니다. CSR에 대한 부분은 합리적이며 CSR은 유효합니다. 하지만 CA에서 인증서에 서명하는 부분은 실패한 것 같습니다. 사용자 정보가있는 인증서를 얻었지만 발급자는 제공되지 않습니다. 웹 사이트의 예제 코드를 사용하므로 무엇을해야할지 모르겠습니다. 제안 사항이 있으십니까? CA 인증서를 잘못 가져올 수 있습니까?

<?php 
    set_include_path("../resources/library/"); 
    include('File/X509.php'); 
    include('Crypt/RSA.php'); 
    //show ALL errors 
    error_reporting(E_ALL); 
    ini_set('display_errors', 1); 

    // Create key pair. 
    $rsa = new Crypt_RSA(); 
    $key = $rsa->createKey(); 
    $privkey = new Crypt_RSA(); 
    $privkey->loadKey($key['privatekey']); 
    $pubkey = new Crypt_RSA(); 
    $pubkey->loadKey($key['publickey']); 
    $pubkey->setPublicKey(); 

    // Create certificate request. 
    $csr = new File_X509(); 
    $csr->setPrivateKey($privkey); 
    $csr->setPublicKey($pubkey); 
    $csr->setDN('CN=www.example.org'); 
    $csr->loadCSR($csr->saveCSR($csr->signCSR())); 

    // Set CSR attribute. 
    $csr->setAttribute('pkcs-9-at-unstructuredName', array('directoryString' => array('utf8String' => 'myCSR')), FILE_X509_ATTR_REPLACE); 

    // Set extension request. 
    $csr->setExtension('id-ce-keyUsage', array('encipherOnly')); 

    // Generate CSR. 

    file_put_contents('csr.pem', $output= $csr->saveCSR($csr->signCSR())); 
    echo $output . "\n"; 

    // Read certificate request and validate it. 
    $csr = new File_X509(); 
    $csr->loadCSR(file_get_contents('csr.pem')); 
    if ($csr->validateSignature() !== true) { 
     exit("Invalid CSR\n"); 
    } 

    // Alter certificate request. 
    $csr->setDNProp('CN', 'www.example.org'); 
    //~ $csr->removeExtension('id-ce-basicConstraints'); 

    // Load the CA and its private key. 
    $pemcakey = file_get_contents("../../myCA/cafile/ca.key"); 
    $cakey = new Crypt_RSA(); 
    $cakey->setPassword('rootca'); // !!!!!! 
    $cakey->loadKey($pemcakey); 
    $pemca = file_get_contents("../../myCA/cafile/ca.crt"); 
    $ca = new File_X509(); 
    $ca->loadX509($pemca); 
    $ca->setPrivateKey($cakey); 

    // Sign the updated request, producing the certificate. 
    $x509 = new File_X509(); 
    $cert = $x509->loadX509($x509->saveX509($x509->sign($ca, $csr))); 

    // Generate the certificate. 
    echo $x509->saveX509($cert) . "\n"; 
?> 

예 출력 먼저 CSR 후 생성 된 인증서는 :

-----BEGIN CERTIFICATE REQUEST----- 
MIIBiTCB9QIBADAaMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5vcmcwgZ0wCwYJKoZI 
hvcNAQEBA4GNADCBiQKBgQC+usAlbhb2Te1NOqIJHPmeGc0TcFa9qJUP8PQIVGip 
YMbv5s2uTjmYm8VfnB9lWgchQksDnx561gSILWkcQboWS6upPk4IHGTULOn6qBM7 
wnODS4aua6MQghUSx9uImyRt4DjQBn/CUEM1bdcvm4YwJy87KAipH4GvNMOxIbB4 
ZQIDAQABoDQwFAYJKoZIhvcNAQkCMQcMBW15Q1NSMBwGCSqGSIb3DQEJDjEPMA0w 
CwYDVR0PBAQDAgABMAsGCSqGSIb3DQEBBQOBgQBZSBz87numzJY+SWhaXpER6g7c 
cllwJAM5kGl0JptVyN63q6zzc4DM+SVpB3/M5DnuVrWs8+pRifUyJRBcCbo3KYt9 
OwJBMO8wCAE7mTKUS/7G3RvAnHyXr3Vp6Ce+qygcmLGlGQ3dcDPeRtHZ5Bhx/j+K 
4ZSgiyvE/AO2hm3iqw== 
-----END CERTIFICATE REQUEST----- 
-----BEGIN CERTIFICATE----- 
MIIBgTCCAWugAwIBAgIUClioDCnX08a7h12xkdKPSdi6Op4wDQYJKoZIhvcNAQEF 
BQAwFTETMBEGA1UEAxMKTXJvdHplayBDQTAeFw0xNjA3MDQxNTE2MjBaFw0xNzA3 
MDQxNTE2MjBaMDQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLm9yZzEYMBYGA1UEAwwP 
d3d3LmV4YW1wbGUub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+usAl 
bhb2Te1NOqIJHPmeGc0TcFa9qJUP8PQIVGipYMbv5s2uTjmYm8VfnB9lWgchQksD 
nx561gSILWkcQboWS6upPk4IHGTULOn6qBM7wnODS4aua6MQghUSx9uImyRt4DjQ 
Bn/CUEM1bdcvm4YwJy87KAipH4GvNMOxIbB4ZQIDAQABozAwLjALBgNVHQ8EBAMC 
AAEwHwYDVR0jBBgwFoAU4AZGByEnlMiUK2anCwjvl+9P8MMwDQYJKoZIhvcNAQEF 
BQADAQA= 
-----END CERTIFICATE----- 

답변

0

나는 falsly 출력 인증서가 더 발행을 포함하지 않는다는 의견을 가지고 있었다. 테스트/디코딩을 위해 https://www.sslshopper.com/certificate-decoder.html을 사용했습니다.

[이 해결] - 모든 설정 정보 + 발행자 도시 는 OpenSSL이 같은 다른 디코더를 사용.

?! 어떤 경우에는 디코더가 모든 헤더 정보를 읽는 것을 엉망으로 만들고 있습니다.

+0

문제를 설명하고 게시하는 유사한 CA 인증서를 만들 수 있습니까? – neubert

+0

표시된 링크가있는 인증서를 sslhopper로 해독하십시오. 그리고 alternativ 디코더를 사용해보십시오. – Jack

+0

게시 한 내용은 CA 인증서가 아니라 생성 된 인증서 인 것 같습니다. 그러나 그것은 내가 당신의 링크와 http://phpseclib.sourceforge.net/x509/decoder.php로 해독했고 그들은 모두 동일한 주제 CN을 보여 주었다고 말했다. sslshopper.com 링크는 발급자 DN을 표시하지 않지만 그것이 발급자 DN이 없다는 것을 의미하지는 않습니다 - 단지 그것을 보여주지 않는다는 것을 의미합니다. – neubert

관련 문제