2013-02-20 53 views
6

私は、自己署名付きX509v3 CA証明書をpyopensslを使って生成しようとしています。 私は、主キー識別子(SKID)を含むkeyidと共に拡張権限キー識別子(AKID)を追加したいと思うでしょう。 しかし、私の次のコードブロックはAKIDにSKIDをコピーせず、むしろ例外をスローします。 は親切に私はこの問題を解決するのに役立つ:) コードpyopensslを使用して自己署名入り証明書を作成する

import OpenSSL 

key = OpenSSL.crypto.PKey() 
key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048) 

ca = OpenSSL.crypto.X509() 
ca.set_version(2) 
ca.set_serial_number(1) 
ca.get_subject().CN = "ca.example.com" 
ca.gmtime_adj_notBefore(0) 
ca.gmtime_adj_notAfter(24 * 60 * 60) 
ca.set_issuer(ca.get_subject()) 
ca.set_pubkey(key) 
ca.add_extensions([ 
    OpenSSL.crypto.X509Extension("basicConstraints", True, 
           "CA:TRUE, pathlen:0"), 
    OpenSSL.crypto.X509Extension("keyUsage", True, 
           "keyCertSign, cRLSign"), 
    OpenSSL.crypto.X509Extension("subjectKeyIdentifier", False, "hash", 
           subject=ca), 
    OpenSSL.crypto.X509Extension("authorityKeyIdentifier", False, "keyid:always",issuer=ca) 
    ]) 
ca.sign(key, "sha1") 
open("MyCertificate.crt.bin", "wb").write(
      OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, ca)) 

を以下のようである私はラインの鍵IDパラメータから「常に」を削除した場合今

Traceback (most recent call last): 
    File "C:\Documents and Settings\Administrator\Desktop\Certificate\certi.py", line 21, in <module> 
    OpenSSL.crypto.X509Extension("authorityKeyIdentifier", False, "keyid:always",issuer=ca) 
Error: [('X509 V3 routines', 'V2I_AUTHORITY_KEYID', 'unable to get issuer keyid'), ('X509 V3 routines', 'X509V3_EXT_nconf', 'error in extension')] 

を次のようにスローされる例外です以下のコード行

OpenSSL.crypto.X509Extension( "authorityKeyIdentifier"、False、私はAKID鍵IDフィールドが空であることを取得し、

  00:84:13:70:73:fe:29:61:5f:33:7d:b3:74:97:3b: 
      3a:f3:11:01:7c:b8:37:a8:8c:72:81:ee:92:fd:91: 
      8a:11:b3:b3:02:b4:97:d5:f8:1b:91:54:7e:15:49: 
      26:6d 
     Exponent: 65537 (0x10001) 
X509v3 extensions: 
    X509v3 Basic Constraints: critical 
     CA:TRUE, pathlen:0 
    X509v3 Key Usage: critical 
     Certificate Sign, CRL Sign 
    X509v3 Subject Key Identifier: 
     CE:D1:31:DE:CF:E3:E2:BC:6C:73:3D:55:F0:88:53:0A:F1:DC:31:14 
    X509v3 Authority Key Identifier: 
     0. 
Signature Algorithm: sha1WithRSAEncryption 
    0b:7b:28:f6:b9:1e:6e:ec:53:6a:c5:77:db:c5:3f:5e:1d:ab: 
    e5:43:73:eb:52:24:af:39:2b:aa:a3:f6:34:e1:92:4b:3b:5e: 
    b6:1 

下に示すように、それはSKIDが含まれていない

)発行者= CA、「鍵ID」事前にありがとう。

答えて

7

これは、使用しているCAキーにsubjectKeyIdentifierが設定されていないことを意味します。

あなたの例では、まだsubjectKeyIdentifierが設定されていないcaへの参照を使用してauthorityKeyIdentifierを作成しています。

あなたのコードaがに変更した場合:

ca.add_extensions([ 
    OpenSSL.crypto.X509Extension("basicConstraints", True, 
           "CA:TRUE, pathlen:0"), 
    OpenSSL.crypto.X509Extension("keyUsage", True, 
           "keyCertSign, cRLSign"), 
    OpenSSL.crypto.X509Extension("subjectKeyIdentifier", False, "hash", 
           subject=ca), 
    ]) 
ca.add_extensions([ 
    OpenSSL.crypto.X509Extension("authorityKeyIdentifier", False, "keyid:always",issuer=ca) 
    ]) 

それが動作します。

関連する問題