Доступ к стеку расширений CSR в M2Crypto - PullRequest
3 голосов
/ 03 января 2011

У меня есть запрос на подпись сертификата с добавленным стеком расширений.При создании сертификата на основе этого запроса я хотел бы иметь возможность получить доступ к этому стеку для использования при создании окончательного сертификата.

Однако, хотя M2Crypto.X509.X509 имеет несколько помощников для доступа к расширениям (get_ext, get_ext_at и т. П.) M2Crypto.X509.Request, по-видимому, предоставляет только элемент для добавления расширений, но не позволяет проверить расширения, уже связанные с данным объектом.

Я что-то здесь упустил?

Ответы [ 2 ]

2 голосов
/ 07 марта 2014

Для тех, кто нашел этот вопрос с помощью поиска в Google, аналогичного тому, что привел меня сюда.

Столкнувшись с подобной проблемой, и в поле зрения не было исправления этого недостатка M2Crypto, я пошел по пути вызова утилиты OpenSSL и парсинга вывода, который выглядит достаточно похожим на YAML, что мы можем немного подделать очистки.

def req_extensions(csrFilename):
    cmd = ('openssl req -text -noout -in %s'
        % csrFilename)

    output = subprocess.check_output(cmd.split(),
        stderr=subprocess.STDOUT)

    output = re.sub(r': rsaEncryption', ':', output)
    output = re.sub(r'[0-9a-f]{2}:', '', output)

    return yaml.load(output)

Тогда ...

csrExt = self.req_extensions('my.csr')
keyUsage = (
    csrExt['Certificate Request']['Data']['Requested Extensions']
          ['X509v3 Key Usage'])

SAN = (
    csrExt['Certificate Request']['Data']['Requested Extensions']
          ['X509v3 Subject Alternative Name'])

и т.д.

2 голосов
/ 04 января 2011

Вы правы.

Текущая версия M2Crypto не предоставляет необходимого интерфейса OpenSSL - X509_REQ_get_extensions.

Просто чтобы дать представление о том, что связано с C:

X509_REQ *req = /* ... */;
STACK_OF(X509_EXTENSION) *exts = X509_REQ_get_extensions(req);
int count = sk_X509_EXTENSION_num(exts);
int i;
for (i = 0; i < count; ++i) {
    X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
    /* Do something with ext */
}
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);

Поскольку M2Crypto использует SWIG для переноса кода на C, не составит труда представить новый API, если у вас хороший фон на языке C.

...