2014-11-24 1 views
1

내부 용으로 간단한 PKI 인프라를 만들려고하고 있으며, <keygen> 태그를 사용하고 싶습니다.phpseclib에서 생성 된 인증서가 KEYGEN 제출 후 브라우저에서 유효하지만 인식되지 않습니다.

이 태그가 서버에 SPKAK을 보내면 서명해야한다는 것을 알고 있습니다. exec을 사용하여 openssl을 시작하고 php 5.5를 사용할 수 없기 때문에 SPKAK를 처리하는 유일한 방법은 phpseclib입니다.

내 코드입니다 :

<?PHP 
    if(isset($_POST['key'])){ 
     header('Content-type: application/x-x509-user-cert'); 
     header('Content-disposition: attachment; filename=user.crt'); 
     include('File/X509.php'); 

     $capem = file_get_contents('root-ca.crt'); 

     $subject = new File_X509(); 
     $subject->loadCA($capem); 
     $subject->loadSPKAC($_POST['key']); 
     $subject->setDN('CN=Username'); 

     $issuer = new File_X509(); 
     $issuer->loadX509($capem); 
     $cakey = new Crypt_RSA(); 
     $cakey->setPassword('SECRETPASSWORD'); 
     $cakey->loadKey(file_get_contents('root-ca.key')); 
     $issuer->setPrivateKey($cakey); 

     $x509 = new File_X509(); 
     $cert = $x509->sign($issuer, $subject); 

     $x509->loadX509($cert); 
     $x509->setExtension('id-ce-keyUsage', array('digitalSignature', 'keyEncipherment')); 
     $x509->setStartDate('-1 day'); 
     $x509->setEndDate('+ 3 year'); 
     $x509->setSerialNumber('1235', 10); 
     $cert = $x509->sign($issuer, $x509); 

     echo $x509->saveX509($cert); 
    }else{ 
?> 
<form method="POST"> 
    <keygen name="key" keytype="RSA" challenge="ucert"> 
    <button>SEND</button> 
</form> 
<?PHP 
    } 
?> 

이상한 것은 생성 된 인증서가 제공 유효 (창 그것을 인식)은 그것을 인식하지 않습니다 (내 testings를에 크롬과 파이어 폭스 모두)하지만 브라우저이다 오류 201 INVALID CERT, 브라우저에 저장된 개인 키와 연결되어 있지 않습니다.

어떻게해야할까요?

+0

인증을 수행하거나 특정 웹 사이트에 대한 https 연결을 설정하기 위해 X509 인증서를 사용하고 있습니까? 나중에 웹 사이트를 지정해야 할 수도 있습니다. 예. '$ subject-> setDomain ('www.google.com', 'www.yahoo.com') '또는 무엇인가. 또한 CA로 사용하고 싶다면'$ x509-> makeCA();'를 할 필요가있다. IDK가 귀하의 질문에 대답하는지 여부. – neubert

+0

클라이언트 인증을위한 인증서를 원합니다. 이미 CA 인증서를 만들었으므로이 스크립트를 사용하여 새 유효한 인증서를 성공적으로 만들 수 있습니다. 문제는 생성 된 인증서를 개인 키 – JohnKiller

+0

과 연결하는 대신 오류 201이 발생한다는 것입니다. 내 생각에 필요한 확장 프로그램이 누락되었습니다. 아니면 keyUsage 필드가 필요합니다. 나는 집에 돌아 가면 놀 수 있지만, 할 수 있으면 직접 로그인 할 수있는 샘플 X509 인증서를 생성 한 다음 pastebin.com 링크를 통해 게시 할 수 있습니다. work idk. – neubert

답변

0
<?php 
include('File/X509.php'); 
include('Crypt/RSA.php'); 

// create private key/x.509 cert for stunnel/website 
$privKey = new Crypt_RSA(); 
extract($privKey->createKey()); 
$privKey->loadKey($privatekey); 

$pubKey = new Crypt_RSA(); 
$pubKey->loadKey($publickey); 
$pubKey->setPublicKey(); 

$subject = new File_X509(); 
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); 
$subject->setPublicKey($pubKey); 

$issuer = new File_X509(); 
$issuer->setPrivateKey($privKey); 
$issuer->setDN($subject->getDN()); 

$x509 = new File_X509(); 

$x509->loadX509($x509->saveX509($x509->sign($issuer, $subject))); 

$x509->setExtension('id-ce-keyUsage', array('digitalSignature', 'keyEncipherment', 'dataEncipherment')); 
$x509->setExtension('id-ce-extKeyUsage', array('id-kp-serverAuth', 'id-kp-clientAuth')); 

$result = $x509->sign($issuer, $x509); 

file_put_contents('key.pem', $privKey->getPrivateKey() . "\r\n" . $x509->saveX509($result)); 

exec('openssl pkcs12 -export -out file.pfx -in key.pem'); 

결과로 생성 된 file.pfx 파일을 Google 크롬으로 가져올 수있었습니다. 그것은 이제 "개인 인증서"로 나타납니다.

+0

개인 키는 태그에 의해 생성되므로 이미 브라우저에 있습니다. 나는 CSR에 서명하고 (SPKAK 내부에 있음) 브라우저에 출력하면됩니다. 사실이게 효과가있다. 유일한 문제는 크롬이 자동으로 가져 오기 대신 오류 201을 준다는 것입니다. – JohnKiller

+0

Google 크롬을 통해 스크립트를 실행하려고하면 오류 207이 발생합니다. 201 오류가 없습니다. idk atm what the 브라우저가 기대하고 있습니다. 브라우저 CA에 서명 인증서가 있었는데 차이가없는 것처럼 보였습니다. 당신은 다른 오류가 발생했기 때문에 당신을 위해 차이를 만들어 낼 수도 있습니다. 또한'$ subject-> loadCA()'는 아무 효과가 없다. 'loadCA()'는 인증서를 확인하기 위해서만 사용됩니다. – neubert

+0

파이어 폭스에서는 오류가 발생하지 않습니다. 파일을 다운로드 할 것인지 묻는 메시지가 나타납니다. http://security.stackexchange.com/q/73810/15922에서 오류 207을 찾아 내기위한 시도를 게시했습니다. – neubert

관련 문제