2016-07-04 71 views
0

Ich möchte meine Certificate Authority mit einer PHP-Schnittstelle ausführen. Als Backend möchte ich phpseclib verwenden. (Version 1.0.2 - https://sourceforge.net/projects/phpseclib/files/phpseclib1.0.2.zip/download)Wie setze ich Aussteller-Informationen (CA) zu Benutzer-Zertifikat - mit phpseclib?

Das CA-Stammzertifikat wird mit openssl generiert und das folgende Skript sollte ein gültiges Clientzertifikat erstellen, das von meiner Zertifizierungsstelle ausgestellt wurde. Der Teil der CSR sieht vernünftig aus und die CSR ist gültig. Aber der Teil, der das Zertifikat mit meiner Zertifizierungsstelle signiert, scheint fehlzuschlagen. Ich bekomme ein Zertifikat mit den Benutzerinformationen, aber kein Aussteller wird angegeben. Ich benutze den Beispielcode der Website - also habe ich keine Ahnung was zu tun ist. Irgendwelche Vorschläge? Wird das CA-Zertifikat falsch importiert?

<?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"; 
?> 

Ausgabe zuerst die CSR und dann das generierte Zertifikat:

-----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----- 

Antwort

0

Ich hatte falsly die Meinung, dass der Ausgang Zertifikat keinen Emittenten enthält. Ich habe https://www.sslshopper.com/certificate-decoder.html zum Testen/Decodieren verwendet.

[gelöst] - Mit einem weiteren Decoder wie openssl alle eingestellten Informationen + Emittenten sind gezeigt.

?! In einigen Fällen liest der Decoder alle Header-Informationen durch?

+0

Könnten Sie ein ähnliches CA-Zertifikat erstellen, das das Problem demonstriert und es veröffentlicht? – neubert

+0

Versuchen Sie, das Zertifikat mit dem gezeigten Link von sslhopper zu dekodieren. Und dann probieren Sie es mit einem alternativen Decoder aus. – Jack

+0

Was Sie gepostet haben, scheint das generierte Zertifikat zu sein und nicht das CA-Zertifikat. Aber das sagte ich entschlüsselte es mit Ihrem Link und http://phpseclib.sourceforge.net/x509/decoder.php und beide zeigen das gleiche Thema CN. Der sslshopper.com-Link zeigt nicht den Aussteller-DN, aber das bedeutet nicht, dass er keinen hat - bedeutet nur, dass er es nicht zeigt. – neubert