2015-04-21 6 views
1

Я создал секретный ключ/CSR из pyOpenSSL - фрагмент кода ниже:CSR представлен IIS ЦС не удается из-ASN1 значения

Ключ:

key = crypto.PKey() 
key.generate_key(type, bits) 
if os.path.exists(_keyfile): 
    print "Certificate file exists, aborting." 
    print " ", _keyfile 
    sys.exit(1) 
else: 
    f = open(_keyfile, "w") 
    f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key)) 
    f.close() 
return key 

КСО:

req = crypto.X509Req() 
# Return an X509Name object representing the subject of the certificate. 
req.get_subject().countryName = country 
req.get_subject().stateOrProvinceName = state 
req.get_subject().localityName = location 
req.get_subject().organizationName = organisation 
req.get_subject().organizationalUnitName = organisational_unit 
req.get_subject().CN = nodename 
# Add in extensions 
#base_constraints = ([ 
# crypto.X509Extension("keyUsage", False, "Digital Signature, Non Repudiation, Key Encipherment"), 
# crypto.X509Extension("basicConstraints", False, "CA:FALSE"), 
#]) 
#x509_extensions = ([]) 
x509_extensions = [] 
# If there are SAN entries, append the base_constraints to include them. 
if ss: 
    san_constraint = crypto.X509Extension("subjectAltName", False, ss) 
    x509_extensions.append(san_constraint) 
req.add_extensions(x509_extensions) 
# Set the public key of the certificate to pkey. 
req.set_pubkey(key) 
# Sign the certificate, using the key pkey and the message digest algorithm identified by the string digest. 
req.sign(key, "sha1") 
# Dump the certificate request req into a buffer string encoded with the type type. 
if os.path.exists(_csrfile): 
    print "Certificate file exists, aborting." 
    print " ", _csrfile 
    sys.exit(1) 
else: 
    f = open(_csrfile, "w") 
    f.write(crypto.dump_certificate_request(crypto.FILETYPE_PEM, req)) 
    f.close() 

Ошибка, которую я получаю от ИС IIS:

ASN1 плохой значение тега выполнено. 0x8009310b (АСН: 267)

В соответствии с этим Microsoft вызвано:

Это происходит, когда запрос сертификата сохраняется в виде файла в кодировке Unicode. Служба сертификатов Microsoft не поддерживает файлы с запросами файлов в кодировке Unicode. Поддерживается только кодировка ANSI.

Я знаю, что если я создам CSR из openssl в командной строке, он будет принят и выпущен веб-сервисом IIS CA RESTful без ошибок.

Я хочу знать, есть ли способ генерировать кодированные ANSI файлы из pyOpenSSL. Я не уверен, что это ключевой файл или CSR, который подписан с ключевым файлом, который вызывает проблемы.

+0

Это исправлено - обновите исходный вопрос. Спасибо @yodatg – ilium007

+0

@jww - сделано и спасибо – ilium007

ответ

1

Я решил это с помощью этого stackoverflow question благодаря @yodatg.

Проблема возникает из-за исправленного bug in pyOpenSSL.

Выдавая:

openssl asn1parse -in certificates/cert.csr 

Я мог видеть ASN1 значение:

8:d=2 hl=2 l= 1 prim: INTEGER   :01 

В рабочей области КСО это выглядит следующим образом:

8:d=2 hl=2 l= 1 prim: INTEGER   :00 

Затем я изменил мой код включить вызов set_version на объект req до подписания:

#set version - IIS CA required this 
req.set_version(0) 

# Set the public key of the certificate to pkey. 
req.set_pubkey(priv_key) 

Это решение разрешено.