使用 Python(加密)生成 CSR

2024-02-27

我有一个可以工作的骨架,但我有点坚持以下几点;

  1. 我没有找到使用加密库处理 SAN (subjectAltName) 的方法?希望我在术语上没有错误,但如果我说——一个主要主机名 test.test.edu,然后又希望该主机也为 Pushu.edu,通常可以是“subjectAltName”。
  2. 有什么办法可以看到整个CSR吗?比如,它在哪里显示主题、状态等?我只想看到它打印到屏幕上,但我没有找到用加密来做到这一点的方法。

任何帮助将不胜感激;到目前为止的代码 -

#!/usr/bin/env python

from OpenSSL import crypto, SSL
import subprocess, os, sys

# Create 'usage' portion
# Something, blah blah, use script like this, blah blah.

# Variable
TYPE_RSA = crypto.TYPE_RSA

# Generate pkey
def generateKey(type, bits):

    keyfile = 'incommon.key'
    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

# Generate CSR
def generateCSR(nodename):

    csrfile = 'incommon.csr'
    req = crypto.X509Req()
    # Return an X509Name object representing the subject of the certificate.
    req.get_subject().CN = nodename
    #req.get_subject().countryName = 'xxx'
    #req.get_subject().stateOrProvinceName = 'xxx'
    #req.get_subject().localityName = 'xxx'
    #req.get_subject().organizationName = 'xxx'
    #req.get_subject().organizationalUnitName = 'xxx'
    # 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('incommon.csr', "w")
        f.write(crypto.dump_certificate_request(crypto.FILETYPE_PEM, req))
        f.close()

#Call key & CSR functions
key = generateKey(TYPE_RSA,2048)
# Needs to take input from user.
generateCSR('test.test.edu')

EDIT:

我不久前就解决了这个问题。这是添加了扩展的代码,或者您可以从我的 Github 克隆它:https://github.com/cjcotton/python-csr https://github.com/cjcotton/python-csr;

# Generate Certificate Signing Request (CSR)
def generateCSR(nodename, sans = []):

    C  = raw_input('Enter your country: ')
    ST = raw_input("Enter your state: ")
    L  = raw_input("Enter your location: ")
    O  = raw_input("Enter your organization: ")
    OU = raw_input("Enter your organizational unit: ")

    # Allows you to permanently set values required for CSR
    # To use, comment raw_input and uncomment this section.
    # C  = 'US'
    # ST = 'New York'
    # L  = 'Location'
    # O  = 'Organization'
    # OU = 'Organizational Unit'

    csrfile = 'host.csr'
    keyfile = 'host.key'
    TYPE_RSA = crypto.TYPE_RSA
    # Appends SAN to have 'DNS:'
    ss = []
    for i in sans:
        ss.append("DNS: %s" % i)
    ss = ", ".join(ss)

    req = crypto.X509Req()
    req.get_subject().CN = nodename
    req.get_subject().countryName = C
    req.get_subject().stateOrProvinceName = ST
    req.get_subject().localityName = L
    req.get_subject().organizationName = O
    req.get_subject().organizationalUnitName = OU
    # Add in extensions
    base_constraints = ([
        crypto.X509Extension("keyUsage", False, "Digital Signature, Non Repudiation, Key Encipherment"),
        crypto.X509Extension("basicConstraints", False, "CA:FALSE"),
    ])
    x509_extensions = base_constraints
    # 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)
    # Utilizes generateKey function to kick off key generation.
    key = generateKey(TYPE_RSA, 2048)
    req.set_pubkey(key)
    req.sign(key, "sha1")
    generateFiles(csrfile, req)
    generateFiles(keyfile, key)
    return req

对于有关如何将 SAN 添加到 CSR 的第一个问题,请考虑使用add_extensions https://github.com/pyca/pyopenssl/blob/77acc3638722fb55744478c00efba07abd6d5a0b/OpenSSL/crypto.py#L824方法上的X509req对象(奇怪的是在文档为X509req class http://pythonhosted.org/pyOpenSSL/api/crypto.html#x509req-objects)

它看起来像这样

altnames = ', '.join(['DNS:foo.example.com',
                      'DNS:bar.example.com', 
                      'IP:203.0.113.12'])
req.add_extensions([OpenSSL.crypto.X509Extension("subjectAltName", 
                                                 False, 
                                                 altnames)])

更新:感谢彼得·加拉格尔 https://stackoverflow.com/users/2476882/peter-gallagher用于捕获丢失的类型前缀(例如DNS, IP)在我原来的答案中。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python(加密)生成 CSR 的相关文章

随机推荐

  • SSL:CERTIFICATE_VERIFY_FAILED 证书验证失败:自签名证书(_ssl.c:1129)

    我正在尝试自动创建受信任的证书和非对称密钥 然后执行自动安装过程 目前 所有这些都是使用 OpenSSL 实用程序手动完成的 我正在使用 Cryptography io 库来实现此自动化 并尝试使用代码生成的证书连接到服务器 当我调用 Po
  • Symfony2 - 从编译器通道访问内核

    有没有办法从编译器通道内部访问内核 我试过这个 public function process ContainerBuilder container kernel container gt get kernel 这会引发错误 还有其他方法吗
  • 是否可以从 Silverlight / C# 调用 matlab 函数?

    是否可以从 Silverlight C 调用 matlab 函数 如果您有一个可以解释 Mathlab 调用的程序集 dll 您应该能够将该程序集包含在您的项目中 并将其与应用程序的其余部分一起编译 显然 您将无法并行运行 Silverli
  • 为什么我的 Android ListAdapter 只显示一项?

    在我的 Android 应用程序中 我正在尝试构建我的第一个自定义列表适配器 我现在设法让它显示一项 但不幸的是 列表中有 8 个项目时 只能显示一项 我的适配器如下所示 public class PossibilitiesAdapter
  • 如何为自定义数组类型重载 Base.show ?

    假设我用它自己的自定义来制作我自己的自定义向量类型show method struct MyVector T lt AbstractVector T v Vector T end function Base show io IO v MyV
  • 如何访问 tf.data.Dataset.list_files() 收集的文件名?

    我在用 file data tf data Dataset list files png 收集图像文件以在 TensorFlow 中进行训练 但希望访问收集的文件名列表 以便执行标签查找 调用 sess run file data 一直不成
  • 将巨大的模型对象保存到文件中

    假设您有一个从 VAR 回归操作返回的 varrest 类模型对象 我想将模型保存到文件中 但不是用于估计系数的所有数据 如何只保存模型规范而不保存训练数据 因为当我保存模型时 它的文件大小超过 1GB 因此加载确实需要时间 可以保存没有某
  • 如何在 Python C-API 中动态创建派生类型

    假设我们有类型Noddy如定义在为 Python 编写 C 扩展模块的教程 http docs python org extending newtypes html adding data and methods to the basic
  • Ruby on Rails 3.2 编译资源无法正常工作

    这是 Rails 资产中的错误吗 我不明白我做错了什么 你能帮忙吗 我不想进行按需编译 The bug Started GET for 127 0 0 1 at 2012 02 02 01 25 44 0200 Processing by
  • SQL SSRS 报告管理器站点每次都要求登录

    SQL Server 2012 SSRS Windows 2008 R2 当尝试通过 URL 访问报告管理器时 http 服务器名称 报告 http servername reports 它提示我们输入用户名和密码 当我输入有效的用户 密码
  • ActiveMQ:在没有代理的情况下启动消费者

    我正在编写一个从队列消费的 JMS 客户端 如果重要的话 我的经纪人是 activemq 一项要求是 即使代理关闭 客户端也应该启动 在这种情况下 它的行为应该就像队列中没有消息一样 一旦代理启动并且消息开始出现 就会做出相应的行为 问题是
  • 删除第一个 git 提交

    我第一次犯错的时候就犯了一个错误 我在另一个人的计算机上 并使用他们的用户名而不是我的用户名推送了一个版本 我怎样才能删除这个 您可以使用以下命令将包含您想要的初始提交的存储库强制推送到 Githubgit push force
  • 是否有任何 HTML 代码可以显示椭圆形或圆角矩形?

    我不确定 HTML 中是否可以 但我仍然会在这里问 是否有任何 HTML 代码可以代表椭圆或圆角矩形 换个角度想 这也是很有可能的 就这样 http virkkunen net b oh dear html http virkkunen n
  • 自动释放:当你被 NARC 逮捕时总是使用吗?

    我知道这个问题看起来像一个骗局 我检查过 但事实并非如此 在谈论 NARC 时 该博客的作者说 http vgable com blog 2010 05 19 n a r c 就我个人而言 我喜欢在同一行立即自动释放我 NARC 编辑的任何
  • 带有 html5 的图像按钮

    我正在尝试制作一个图像按钮 我正在使用 学习 html5 和 jquery mobile 这是我的示例代码 img src img beer png alt beer
  • 检查 bash 脚本中 C 程序的返回值?

    我有一个 bash 脚本 在其中使用 检查上次运行命令的退出代码变量 但现在我正在执行一个 C 程序 来自该脚本 如果程序成功执行 则返回 0 有什么方法可以在我的 bash 脚本中捕获 C 程序的返回值吗 我相信 awk sed 等不同的
  • jQuery 解析/显示来自 php json_encode 的 json 数据

    jquery 中的初始 ajax 调用 ajax type post url items data php data id id dataType json success function data if data make item r
  • 我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

    当我尝试对 UIBarButtonItem 使用图像时 不显示文本 有没有办法同时显示文字和图像 您可以使用具有图像和文本的自定义视图来初始化 UIBarButtonItem 这是一个使用 UIButton 的示例 UIImage chat
  • 在 Angular 中向 ckeditor 添加简单的上传适配器

    我确实通过安装在我的角度项目中启动了经典的ckeditor npm install save ckeditor ckeditor5 angular npm install save ckeditor ckeditor5 build clas
  • 使用 Python(加密)生成 CSR

    我有一个可以工作的骨架 但我有点坚持以下几点 我没有找到使用加密库处理 SAN subjectAltName 的方法 希望我在术语上没有错误 但如果我说 一个主要主机名 test test edu 然后又希望该主机也为 Pushu edu