如何生成HTTP ca.cert?

如何生成HTTP ca.cert?

如果我使用生成证书+私钥对,在Linux上使用以下命令:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

这将生成两个文件(key.pem 和 cert.pem),并要求我输入加密/解密私钥的密码;有人可以提示我如何生成 ca .cert 吗?欢迎任何初级解释。我正在尝试遵循:

理想情况下,消息应使用 X509 证书密钥对进行签名。这样,双方就可以验证消息是否来自正确的一方,以及消息是否在传输过程中被篡改。它不提供消息加密;为此,应使用传输级加密 (TLS)。

更新

更具体地说,我正在使用用于客户端/服务器 HTTP 通信的 Python 框架(aiohttp 应用程序)。这里在 git repo 中,他们有一个,generate_certs.sh如果你在 BASH 中运行它,它将生成所有这些密钥和 crt 文件,如下面的屏幕截图所示。CLIENT 是 VEN,SERVER 是 VTN:

在此处输入图片描述

我可以让这个框架通信与 HTTP 一起工作,但我对 TLS HTTPS 需要什么有点困惑,他们有一些关于消息签名的信息

当我配置 aiohttp 应用程序时,我需要包含什么?它generate_certs.sh不会提示输入密码。

为了服务器如果我使用下面这个配置:

# Create the server object
server = OpenADRServer(vtn_id='cloud_vtn_tls',
                       http_host='0.0.0.0',
                       cert='./certificates/dummy_vtn.pem',
                       key='./certificates/dummy_vtn.pem',
                       http_cert='./certificates/dummy_vtn.pem',
                       http_key='./certificates/dummy_vtn.pem',
                       ven_lookup=ven_lookup_function,
                       http_ca_file='./certificates/dummy_ca.crt',
                       )

客户

# Create the client object
client = OpenADRClient(ven_name='dan_ven1',
                         vtn_url='https://11.12.13.14:8080/OpenADR2/Simple/2.0b',
                         cert='./certificates/dummy_ven.crt',
                         key='./certificates/dummy_ven.key',
                         ca_file='./certificates/dummy_ca.crt',
                         vtn_fingerprint='59:4D:D8:CD:35:8E:E7:F7:86:94')

当我启动服务器脚本时,它出现错误,就像我遗漏了什么东西一样。

    (python_env) bbartling@localhost:/var/lib/openleadr-python$ python vtntestcerts.py
    Traceback (most recent call last):
      File "/var/lib/openleadr-python/vtntestcerts.py", line 59, in <module>
        server = OpenADRServer(vtn_id='cloud_vtn_tls',
      File "/var/lib/openleadr-python/openleadr/server.py", line 109, in __init__
        self.ssl_context.load_cert_chain(http_cert, http_key, http_key_passphrase)
    FileNotFoundError: [Errno 2] No such file or directory

答案1

部分答案(请编辑您的问题,以便我可以使其不那么片面):

问题中的命令行会生成一个自签名证书以及使用它的密钥。如果您想要客户端或服务器证书,这通常是您所要做的全部工作。

“CA” 的意思是“证书颁发机构”,这是一个额外的“机构”,因为没有更好的词来签署你的证书。除非你想要很多证书都由同一个证书颁发机构签署,因为你只想给其他各方一个可以信任的“签名”证书,否则这是不是你需要什么。(但你没有解释你的用例,也就是说,为什么您需要一张证书)。

如果您想要的是单个文件而不是两个文件,则有多种不同的文件格式可供选择。一种是 PKCS12,通常以.p12.pfx结尾。openssl如果需要,您可以使用它来创建这些文件。但具体细节取决于哪些程序您想使用您的证书,请编辑问题并添加此信息。


我不熟悉 OpenADR,但你链接的脚本会生成一个 CA 证书,然后迹象服务器和客户端证书都需要信任。这意味着当服务器检查客户端证书时,或者反之亦然,客户端检查服务器证书时,双方都需要信任 CA 证书。

因此,通过执行 shell 脚本,所有证书应该都已为您正确创建。如果您没有执行此操作,则需要执行它 - 单个命令行不足以生成所有证书。

至于“文件未找到”消息,要么您没有运行 shell 脚本,要么相对路径不起作用 - 请尝试绝对路径。

另外,我缺少http_key_passphrase服务器中的参数(除非在其他地方给出)。


脚本使用genrsa附加步骤生成密钥。man genrsa告诉您有一个-passout选项,man openssl描述格式,因此请尝试-passout 'pass:mypassphrase'向所有三个您认为应该有密码的密钥添加密码。如果您不想在脚本中使用密码,请使用其他方法之一。

不过,我不知道您的框架支持哪些证书的密码,因此,首先我会尝试让一切在没有密码的情况下正常工作......

相关内容