2016-08-26 31 views
0

pyOpenSSL을 사용하여 X509 인증서를 만듭니다. 내 Java 응용 프로그램에서이 인증서를 사용할 수있게하려면이 인증서를 Java JKS 키 저장소로 가져와야합니다. 인증서에 subjectAltName 확장명을 추가하지 않는 한 정상적으로 작동합니다. 인증서가 다른 주제 세트가있는 경우, JKS 키 저장소로 가져 오기가 실패JKS 키 저장소에 subjectAltName (SAN)이있는 X509 인증서 가져 오기

[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 

는 IS :

[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을 사용하여이 인증서를 인쇄 할 경우, 나는이 출력을 얻을 인증서가 분명히 유효합니다. oracle's documentation에 따르면 Java 8 키 도구는 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 인증서에는 확장 지원을 사용할 수 없습니다.

그리고 3 버전을 설정하는 내 파이썬 코드를 적응 후 (버전을 기반으로 0으로 실제로 2), 키 도구로 가져 오기가 예상대로 작동합니다

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