使用pyOpenSSL创建CSR和自签名证书

时间:2017-04-20 12:20:01

标签: ssl openssl tls1.2 csr pyopenssl

使用pyOpenSSL我想创建

  1. 用于自我签名的密钥对
  2. 证书签名请求(csr)
  3. 自签名证书
  4. 当我使用openSSL命令行工具时,我使用以下命令来执行此操作:

    1. 用于自签名的密钥对

      openssl genrsa -out pkey.pem 2048

      openssl rsa -in pkey.pem -out public-pkey.pem -outform PEM -pubout

    2. 证书签名请求(csr)

      openssl req -new -key pkey.pem -subj "/C=US/O=XXX/CN=XXX" -days 365 -out csrrequest.csr

    3. 自签名证书

      openssl x509 -in csrrequest.csr -req -signkey pkey.pem -days 365 -set_serial 0x12345 -sha256 -out selfsignedcert.pem

    4. 这有效!服务器接受自签名证书并返回服务器签名证书。

      对于pyOpenSSL,我使用以下代码:

      1. 用于自签名的密钥对

        psec = crypto.PKey()

        psec.generate_key(crypto.TYPE_RSA, 2048)

      2. 证书签名请求(csr)

        csrrequest = crypto.X509Req()

        csrrequest.get_subject().C = "US"

        csrrequest.get_subject().O = "XXX"

        csrrequest.get_subject().CN = "XXX"

        csrrequest.set_pubkey(psec)

      3. 自签名证书

        selfsignedcert = crypto.X509()

        selfsignedcert.set_serial_number(12345)

        selfsignedcert.gmtime_adj_notBefore(0)

        selfsignedcert.gmtime_adj_notAfter(365*24*60*60)

        selfsignedcert.set_subject(csrrequest.get_subject())

        selfsignedcert.set_issuer(selfsignedcert.get_subject())

        selfsignedcert.set_pubkey(csrrequest.get_pubkey())

        selfsignedcert.sign(psec, "sha256")

      4. 这不起作用!服务器不接受自签名证书。服务器无法签名并返回服务器签名证书。

        但是,通过使用pyOpenSSL,我错过了openssl x509 -in csrrequest.csr -req的输入来创建自签名证书...

        我的错在哪里?有谁知道我做错了什么?

        谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用私钥对CSR进行签名(类似于自签名证书,但是CA会在最终证书中用自己的签名替换此签名)。

尝试csrrequest.sign(psec,"sha256")

答案 1 :(得分:0)

什么是行不通的?

我注意到时间设置错了

代替:

selfsignedcert.gmtime_adj_notBefore(0)

selfsignedcert.gmtime_adj_notAfter(365*24*60*60)

如果您尝试过

current_ts = int(datetime.datetime.now().timestamp())

selfsignedcert.gmtime_adj_notBefore(current_ts)

selfsignedcert.gmtime_adj_notAfter(current_ts + 365*24*60*60)