1. 生成私钥
首先,生成一对 RSA 私钥。你可以指定密钥长度,常用的长度为 2048 或 4096。
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
-algorithm RSA
:指定使用 RSA 算法生成私钥。
-out private_key.pem
:输出到文件 private_key.pem
。
-pkeyopt rsa_keygen_bits:2048
:生成 2048 位的密钥
2. 创建证书签名请求 (CSR)
接下来,使用生成的私钥创建证书签名请求 (CSR)。你需要提供证书的信息,例如国家 (Country)、省份 (State)、组织名 (Organization)、以及通用名 (Common Name, CN)。
openssl req -new -key private_key.pem -out cert_request.csr
在执行这条命令时,OpenSSL 会提示输入一系列信息:
- Country Name (2 letter code):国家代码,如
US
。 - State or Province Name (full name):省份或州,如
California
。 - Locality Name (eg, city):城市,如
San Francisco
。 - Organization Name (eg, company):组织名,如
My Company Ltd
。 - Organizational Unit Name (eg, section):部门名,如
IT
。 - Common Name (e.g. server FQDN or YOUR name):主机名(或域名),如
www.example.com
。
此过程会生成一个 cert_request.csr
文件,这是证书的请求文件。
3. 生成自签名证书
如果你不打算使用第三方证书颁发机构 (CA) 来签发证书,而是创建一个自签名证书,可以使用以下命令:
openssl x509 -req -days 365 -in cert_request.csr -signkey private_key.pem -out certificate.pem
-req
:表示使用 CSR 生成证书。
-days 365
:证书的有效期为 365 天(你可以根据需求调整)。
-signkey private_key.pem
:使用生成的私钥签署证书。
-out certificate.pem
:输出证书到 certificate.pem
。
—–BEGIN PRIVATE KEY—– 开头的文件和 —–BEGIN RSA PRIVATE KEY—–开头的文件有什么不同
这两种开头的文件都是私钥文件,但是它们所使用的加密算法不同。
—–BEGIN PRIVATE KEY—– 开头的文件通常包含的是 PKCS#8 格式的私钥,而 PKCS#8 是一种通用的私钥格式,可以支持不同种类的加密算法,如 RSA、DSA、ECDSA 等。因此,这种格式的私钥文件可能不仅限于 RSA 加密算法。
而
—–BEGIN RSA PRIVATE KEY—– 开头的文件则只包含 RSA 加密算法所使用的私钥信息,并采用了 PKCS#1 格式。这种格式的私钥文件仅适用于 RSA 加密算法。
PKCS#1 to PKCS#8
openssl pkcs8 -topk8 -inform pem -in logstash.key -outform pem -nocrypt -out logstash-pkcs8.key
或者
openssl pkcs8 -topk8 -inform pem -in logstash.key -outform pem -out logstash-pkcs8-enc.key
-nocrypt
:表示不加密输出的私钥。生成结果:输出的
logstash-pkcs8.key
文件是未加密的 PKCS#8 格式私钥,任何人获得该文件即可直接使用私钥。适用场景:一般用于受信任的环境,比如文件将被安全地存储或传输的情况下使用。
不指定
-nocrypt
,默认会加密:此命令会生成加密的 PKCS#8 格式私钥文件,输出的logstash-pkcs8-enc.key
文件会使用用户交互过程中提供的密码对私钥进行加密。生成结果:私钥将被加密,需要密码才能使用该私钥,保护私钥的安全性。
适用场景:适合在不完全信任的环境中使用,确保即使私钥文件被泄露,其他人也无法使用该私钥,除非他们知道加密密码。
PKCS#8 to PKCS#1
openssl rsa -in logstash-pkcs8.key --out logstash-pkcs1.key