2016-08-26 87 views
0

我使用pyOpenSSL创建X509证书。我需要将此证书导入到Java JKS密钥库中,以使其可用于我的Java应用程序。只要我不向证书添加subjectAltName扩展名,就可以正常工作。如果证书具有替代主体集合,导入到JKS密钥库失败:将subjectAltName(SAN)的X509证书导入JKS密钥库

[email protected]:~# /opt/oracle/java/jdk64-1.8.0_92/bin/keytool -keystore keystore -storepass changeit -noprompt -importcert -alias example -file certificate.crt -v 
keytool error: java.lang.Exception: Input not an X.509 certificate 
java.lang.Exception: Input not an X.509 certificate 
    at sun.security.tools.keytool.Main.doCommands(Main.java:1009)655) 
    at sun.security.tools.keytool.Main.main(Main.java:336) 
[email protected]:~# 

如果我打印在命令行上使用OpenSSL这个证书,我得到这样的输出:

[email protected]:~# openssl x509 -in certificate.crt -text -noout 
Certificate: 
    Data: 
     Version: 1 (0x0) 
     Serial Number: 0 (0x0) 
    Signature Algorithm: sha256WithRSAEncryption 
     Issuer: OU=example.com, CN=my-server.example.com, O=example.com 
     Validity 
      Not Before: Aug 26 12:03:03 2016 GMT 
      Not After : Aug 25 12:03:03 2021 GMT 
     Subject: OU=example.com, CN=my-server.example.com, O=example.com 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:cc:a7:53:5a:38:...:11:2f 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Alternative Name: 
       DNS:localhost 
    Signature Algorithm: sha256WithRSAEncryption 
     ab:51:12:fb:a6:a6:...:0d:4b 

这是证书显然是有效的。根据oracle's documentation,Java 8 keytool应该支持SubjectAlternativeName扩展。

当我试图生成密钥工具本身的一切 - 这似乎工作 - 我注意到,通过密钥工具生成的证书具有第二扩充X509v3 Subject Key Identifier

Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 1510484556 (0x5a082a4c) 
    Signature Algorithm: sha256WithRSAEncryption 
     Issuer: O=example.com, OU=example.com, CN=my-server.example.com 
     Validity 
      Not Before: Aug 26 12:52:43 2016 GMT 
      Not After : Nov 24 12:52:43 2016 GMT 
     Subject: O=example.com, OU=example.com, CN=my-server.example.com 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:99:b6:b1:11:a6:...:7b:39 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Alternative Name: 
       DNS:localhost 
      X509v3 Subject Key Identifier: 
       66:75:AD:7A:A5:19:AB:43:DE:55:E4:A7:4F:C2:3D:53:55:49:CE:48 
    Signature Algorithm: sha256WithRSAEncryption 
     50:7c:fe:c8:5d:1b:...:da:27 

我需要这个扩展添加到我的证书也使用pyOpenSSL。但是,什么是正确的价值?!

回答

1

那么,在写下这个问题的一切之后,我注意到在使用pyOpenSSL生成的证书和keytool之间存在第二个差异。 keytool证书状态Version: 3 (0x2),而另一个说Version: 1 (0x0)

我没有太多的X509规格,但作为扩展名前缀X509v3我想这扩展支持不适用于版本1证书。

和适应我的Python代码的版本设置为3后(实际上2为版本为0为主),导入到密钥工具按预期工作:

_req = OpenSSL.crypto.X509Req() 
_req.set_version(2) 
...