CSR, отправленный в ЦС IIS, завершается ошибкой из-за значения ASN1

Я сгенерировал закрытый ключ/CSR из pyOpenSSL — фрагмент кода ниже:

Ключ:

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 (ASN: 267)

Согласно Microsoft, это вызвано:

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

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

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


person ilium007    schedule 21.04.2015    source источник
comment
Теперь это исправлено - обновите исходный вопрос. Спасибо @yodatg   -  person ilium007    schedule 21.04.2015
comment
@jww - готово и спасибо   -  person ilium007    schedule 22.04.2015


Ответы (1)


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

Проблема возникает из-за исправленной ошибки в pyOpenSSL.

По выпуску:

openssl asn1parse -in certificates/cert.csr

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

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

В работающем CSR это выглядит так:

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)

Теперь это решено.

person ilium007    schedule 22.04.2015