【问题标题】:Phpseclib KeyUsagePhpseclib 密钥使用
【发布时间】:2012-12-09 17:18:11
【问题描述】:

由 PhpSecLib 创建的默认证书文件的 keyUsage 设置为:All rules of applications。我如何将 keyUsage 设置为 digitalSignature Windows Crypto Shell 将显示:Ensures the Identity of a remote computer

编辑

这是我的代码:

<?php
include('File/X509.php');
include('Crypt/RSA.php');
$c = $_POST['csr'];

$CAPrivKey = new Crypt_RSA();
$CAPrivKey->setPassword('[...]');
$CAPrivKey->loadKey("-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
");

$issuer = new File_X509();
$issuer->setPrivateKey($CAPrivKey);
$issuer->loadX509("-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
");


$subject = new File_X509();

$subject->loadCSR($c); 


$x509 = new File_X509();
$x509->setStartDate('-1 month');
$x509->setEndDate('+1 year');
$x509->setSerialNumber('125');
$result = $x509->sign($issuer, $subject);


$x509->loadX509($result);
$x509->setExtension('id-ce-keyUsage', array_merge($x509->getExtension('id-ce-   keyUsage'), array('digitalSignature')));
$result = $x509->sign($issuer, $x509);
//echo $x509->saveX509($result);

header('Content-Type: application/x-x509-ca-cert');
header("Content-Disposition: attachment; filename='ssl.cer'");
echo $x509->saveX509($result);

?>

【问题讨论】:

    标签: php ssl certificate ssl-certificate phpseclib


    【解决方案1】:

    除非您要退出证书,否则您需要先执行 $x509->sign() 来创建证书。然后您需要重新加载该证书,设置扩展名,将其退出并保存。例如。

    <?php
    include('File/X509.php');
    include('Crypt/RSA.php');
    
    $privKey = new Crypt_RSA();
    $privKey->loadKey('...');
    
    $pubKey = new Crypt_RSA();
    $pubKey->loadKey($privKey->getPublicKey());
    $pubKey->setPublicKey();
    
    $subject = new File_X509();
    $subject->setDNProp('id-at-organizationName', 'demo cert');
    $subject->setPublicKey($pubKey);
    
    $issuer = new File_X509();
    $issuer->setPrivateKey($privKey);
    $issuer->setDN($subject->getDN());
    
    $x509 = new File_X509();
    //$x509->makeCA();
    $x509->setSerialNumber('1');
    
    $result = $x509->sign($issuer, $subject);
    $x509->loadX509($result);
    $x509->setExtension('id-ce-keyUsage', array('digitalSignature'));
    //$x509->setExtension('id-ce-keyUsage', array_merge($x509->getExtension('id-ce-keyUsage'), array('digitalSignature')));
    $result = $x509->sign($issuer, $x509);
    echo $x509->saveX509($result);
    ?>
    

    如果整个辞职的事情都是不必要的,那就太好了。我会看看我是否可以让 phpseclib 作者在某个时候对其进行一些修改。

    【讨论】:

    • 好的,它会生成,但是当我尝试打开它时,它会显示值:N/A in KeyUsage 字段
    • 我更新了我的帖子以包含我正在使用的完整代码。如果您在发布代码时遇到问题,这将有助于我诊断它们。就像你在做 makeCA() 一样?有很多可能的排列,我不想尝试所有的排列。谢谢!
    【解决方案2】:

    当我尝试运行您的代码时,我遇到了一堆错误。主要是因为这行:

    $x509->setExtension('id-ce-keyUsage', array_merge($x509->getExtension('id-ce-   keyUsage'), array('digitalSignature')));
    

    两个问题:

    1. id-ce- 和 keyUsage 之间有空格。这些空间不应该存在。

    2. 如果 getExtension 返回 NULL,array_merge 将返回 NULL。 IE。如果该扩展名未定义。因此,您需要做的是:

      $x509->setExtension('id-ce-keyUsage', array('digitalSignature'));
      

    【讨论】:

    • 好的,谢谢。我很好奇哪个字段确定 Windows 将使用证书声明为 Ensures the Identity of a remote computer,因为它仍然在属性中显示:All rules of applicationsdigitalSignature。对于 OpenSSL,它有效。
    • 正如我的第二个答案所展示的那样,它对我来说很好。总结一下那个帖子......你可以发布你的证书和你用来获取它的 CSR 吗?另外,考虑一下..您使用的是什么版本的Windows?我正在使用 Windows 7..
    【解决方案3】:

    您可以发布您的证书吗?因为当我使用你的程序时,它完全不是为我做的。我的代码:

    <?php
    include('File/X509.php');
    include('Crypt/RSA.php');
    
    $c = '-----BEGIN CERTIFICATE REQUEST-----
    MIIBVjCBwgIAMB4xHDAaBgNVBAoME3BocHNlY2xpYiBkZW1vIGNlcnQwgZ0wCwYJKoZIhvcNAQEB
    A4GNADCBiQKBgQDF+1/N2DwvdkhoHsLq8LnH99AEGVOGpooSpbPCewbuZeqr/Djb9ySPar2PLySo
    Y+kB2QAbxUgpO/57IpWIabQ9jDFIznqLCcLzXKiKOWnMv4KMf55yJ6pwlqoTbUPgyQ67CRAfjcaD
    W9VQ/TzdKahdxLFPBAEIEpEX23YpLhTLNQIDAQABMAsGCSqGSIb3DQEBBQOBgQALjJE4OygjvLm0
    rzFyMPvAo7Ux6z5qTOi//HQzzmjNun7MV09GTfZgcYeWvuLosJXcn7CPALF5FqHWePs98WioTA7K
    WsvdZzm+yJ5UcmzdJ/Jq9X8o1KTsMELN0SQwiNk502a1wbiXotF4OgCsjSdno96PCV9VSF4w69HM
    1eXfvg==
    -----END CERTIFICATE REQUEST-----';
    
    
    $CAPrivKey = new Crypt_RSA();
    $CAPrivKey->loadKey('-----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
    wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
    1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
    3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2
    pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX
    GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
    AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
    L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
    X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
    U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
    37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=
    -----END RSA PRIVATE KEY-----');
    
    $issuer = new File_X509();
    $issuer->setPrivateKey($CAPrivKey);
    $issuer->loadX509("-----BEGIN CERTIFICATE-----
    MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM
    MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
    THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x
    MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
    MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
    FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
    gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy
    wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B
    d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM
    BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
    LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
    BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
    Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
    ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
    AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp
    ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le
    IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==
    -----END CERTIFICATE-----");
    
    
    $subject = new File_X509();
    
    $subject->loadCSR($c); 
    
    
    $x509 = new File_X509();
    $x509->setStartDate('-1 month');
    $x509->setEndDate('+1 year');
    $x509->setSerialNumber('125');
    $result = $x509->sign($issuer, $subject);
    
    
    $x509->loadX509($result);
    $x509->setExtension('id-ce-keyUsage', array('digitalSignature'));
    //$x509->setExtension('id-ce-keyUsage', array_merge($x509->getExtension('id-ce-keyUsage'), array('digitalSignature')));
    $result = $x509->sign($issuer, $x509);
    //echo $x509->saveX509($result);
    
    header('Content-Type: application/x-x509-ca-cert');
    header("Content-Disposition: attachment; filename='ssl.cer'");
    echo $x509->saveX509($result);
    

    截图:

    证书本身:

    -----BEGIN CERTIFICATE-----
    MIICCzCCAXagAwIBAgIDMTI1MAsGCSqGSIb3DQEBBTBoMQswCQYDVQQGEwJVUzET
    MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxQNTW91bnRhaW4gVmlldzETMBEG
    A1UEChQKR29vZ2xlIEluYzEXMBUGA1UEAxQOd3d3Lmdvb2dsZS5jb20wIhgPMjAx
    MjExMjUwNzE0MTJaGA8yMDEzMTIyNTA3MTQxMlowHjEcMBoGA1UECgwTcGhwc2Vj
    bGliIGRlbW8gY2VydDCBnTALBgkqhkiG9w0BAQEDgY0AMIGJAoGBAMX7X83YPC92
    SGgewurwucf30AQZU4amihKls8J7Bu5l6qv8ONv3JI9qvY8vJKhj6QHZABvFSCk7
    /nsilYhptD2MMUjOeosJwvNcqIo5acy/gox/nnInqnCWqhNtQ+DJDrsJEB+NxoNb
    1VD9PN0pqF3EsU8EAQgSkRfbdikuFMs1AgMBAAGjDzANMAsGA1UdDwQEAwIHgDAL
    BgkqhkiG9w0BAQUDgYEAMtVKyBpbvD2txhlRtA3VHoL1Zp9E7CN/EqFxpAG7bwZT
    8D1gifeff4tGH0zkbGvv+5kb5exBZ+PhGsaaHVZoBQVO33Rkr32rfMeMa7PYb76L
    i+f0mOp1QfPbrQuvT/uJx8AUv/Owsk5zLyE7JznsvYQ7VeGARRAike2ThHGcZQ8=
    -----END CERTIFICATE-----
    

    就像我说的,它对我来说效果很好。

    也许您可以发布您在尝试运行时获得的证书?也许您也可以发布您正在使用的 CSR?

    【讨论】:

    • 嗯,我也一样,但现在我有点困惑。我误解了一些东西。我很好奇如何更改出现在“常规”选项卡上的描述。
    • 我自己在“常规”选项卡上没有看到太多描述。这是我看到的内容:i.stack.imgur.com/LJpiS.jpg你能张贴你看到的截图吗?
    • 首先尝试安装,一切都会出现。因为我没有英文版的 Windows,所以我不能给你发截图。
    • 我只有在安装签名证书时才会遇到这个问题,但我不知道是什么原因造成的。根据详细信息选项卡,证书的密钥仅用于数字签名。我不知道“常规”选项卡显示什么。也许它以某种方式来自签名证书 - 不确定。我可能会在 superuser.com 上问。这似乎几乎是一个 Windows 管理员问题..
    猜你喜欢
    • 2015-10-14
    • 2019-01-26
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多